Может ли память сочетаться с идиомой PIMPL?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Может ли память сочетаться с идиомой PIMPL?

Сообщение Anonymous »

Код: Выделить всё

class Foo
{
private:
int a;
bool b;
float c;
}
У меня есть класс, подобный приведенному выше, который используется при взаимодействии с API, который сам взаимодействует с графическим процессором.
Чтобы Чтобы уменьшить передачу CPU->GPU, этот API настраивает буферы в памяти GPU/VRAM на основе смежных сегментов памяти CPU/RAM. Это означает, что буферы заполняются (в большинстве случаев) массивами чего-то вроде Foo, при этом API ожидает, что a, b, c и т. д. будут находиться с точными смещениями. в оперативной памяти с начала каждого экземпляра Foo. Обычно это не проблема, поскольку я могу просто указать буферу проверить offsetof() каждого члена в Foo, но проблема возникает с добавленным контекстом.
< р>Я пытаюсь интегрировать сам Foo в свой собственный API и поэтому хочу использовать PIMPL, чтобы скрыть объявление членов Foo от пользователей API:

Код: Выделить всё

#include 

class Foo
{
class PIMPL;
public:
Foo();
private:
std::unique_ptr
 impl;
}

Код: Выделить всё

class Foo::PIMPL{
public:
int a;
bool b;
float c;
}

Foo::Foo(){
impl = std::make_unique
();
}
Теперь объявления членов компилируются отдельно от пользователей моего API в файле .cpp, но это сейчас означает, что я больше не могу гарантировать, что , b, c и т. д. имеют последовательные непрерывные смещения ОЗУ от начала каждого экземпляра Foo в вышеупомянутых буферах, поскольку, насколько я понимаю, вызов std ::make_unique() может создать экземпляр PIMPL где угодно в оперативной памяти и не обязательно рядом с экземпляром Foo, которому он принадлежит.
Какие решения доступны мне, чтобы позволить PIMPL скрывать объявления членов от пользователей моего API и по-прежнему гарантировать, что каждый элемент скрыт PIMPL< /code> будет иметь постоянное смещение ОЗУ от начала любого и каждого экземпляра Foo?


Подробнее здесь: https://stackoverflow.com/questions/791 ... impl-idiom
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»