хранение многотипных данных в нетипизированном пространстве памяти - PullRequest
1 голос
/ 02 марта 2012

В следующем примере кода, как я могу заставить * y указать смещение 4?Прямо сейчас, только указывает на смещение 0, что для * x, а не * y.

(обратите внимание, что * x & * y будет иметь 4 байта каждый)

unsigned char *p = new unsigned char[8];
int *x = &*(int *) p;
*x = 1;
int *y = &*(int *) p;
*y = 2;

Пожалуйста, неговорить о структуре или других путях, они мне не помогут.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Если вы на самом деле храните несколько типов в смежном буфере, вам может быть очень больно, когда речь заходит о проблемах выравнивания. Не все типы могут быть выровнены на одних и тех же границах памяти: некоторым может потребоваться выравнивание по 32-разрядным, другим - 64-разрядным, а некоторым - 128-разрядным, и это зависит от платформы.

Некоторое чтение, чтобы начать работу , но вы должны прочитать намного больше, включая выравнивание пользовательских типов, а также для различных компиляторов и операционных систем, на которые вы ориентируетесь, если вы действительно хотите это сделать как вы делаете, не используя более структурированный подход (например, подходы типа Variant, сочетающие статический и динамический полиморфизм).

Фактически, материал, который вам нужно понять, если вы хотите это сделать, очень похож на то, что вы должны узнать о выравнивании данных при реализации своего собственного распределителя памяти (общий распределитель памяти должен иметь дело со способностью хранить несколько типов в смежных буферах), поэтому поиск похожих тем может дать вам то, что вам нужно. Я не могу не сказать, что эта проблема низкого уровня может принести вам и вашим коллегам гораздо больше горя, чем кто-либо должен был бы заслужить.

Вам необходимо знать, какие типы должны быть выровнены по каким границам (байт, слово, двойное слово, четырехсловное слово). Это также меняется. Например, вы не можете хранить int, который не выровнен по границам слова. В некоторых системах это может привести к огромным потерям производительности для невыровненных ходов или даже к аварийному завершению вашей программы. По этой же причине структуры обычно имеют отступы внутри, чтобы обеспечить правильное выравнивание всех данных.

Однако, для вашего непосредственного примера, который не смешивает типы (только целые числа):

unsigned char *p = new unsigned char[sizeof(int) * 2];
int *x = &*(int *) p;
*x = 1;

// advance your unsigned char* pointer by the size of x
p += sizeof x; // or sizeof(int)

int *y = &*(int *) p;
*y = 2;
1 голос
/ 02 марта 2012
#include <cstdint>

unsigned char *p = new unsigned char[8];
int32_t *x1=reinterpret_cast<int*>(p);
int32_t *x2=reinterpret_cast<int*>(p+4);

Тем не менее, пожалуйста, скажите нам точно, что вы пытаетесь сделать в более широком контексте, там почти наверняка есть лучший способ сделать это.

Пожалуйста, также используйте шрифт определенного размера, этот типпрограммирование чревато болью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...