Я разрабатываю очень минимальный класс указателя смещения.
Это идеальный вариант. Целью являются связанные структуры данных в общей памяти, которые должны справляться с различным смещением виртуального адреса в разных процессах. Идея вдохновлена boost::interprocess::offset_ptr
Мой первый тест показал вывод, зависящий от уровня оптимизации, что предполагает неопределенное поведение. Как это можно исправить? См. например
Код: Выделить всё
#include
#include
template
class NullableOffsetPtr
{
public:
NullableOffsetPtr(T const* ptr) :
offset_{
ptr == nullptr ? std::ptrdiff_t{1} : reinterpret_cast(ptr) - reinterpret_cast(this)}
{
}
T* get()
{
return offset_ == 1 ? nullptr : reinterpret_cast(reinterpret_cast(this) + offset_);
}
private:
std::ptrdiff_t offset_; // Using units of bytes, as alignments of *this and *ptr may not match.
};
class Sample
{
};
int main(int argc, char* argv[])
{
Sample sample;
NullableOffsetPtr ptr{&sample};
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78427986/what-is-undefined-behaviour-in-these-pointer-conversions[/url]