Размер структуры (sizeof) в C++ не соответствует реальному размеру в случае массивов
Я использую динамические массивы следующей структуры:
struct TestStructure
{
unsigned int serial;
int channel;
int pedestal;
int noise;
int test;
};
Sizeof (TestStructure) возвращает 20, поэтому я предполагаю, что в структуре нет заполнения / выравнивания. Это логично, потому что есть только 4-байтовые типы.
Но я обнаружил, что размер структуры, умноженный на количество элементов, не равен размеру массива. Между элементами массива есть дополнительная накладка! Итак, в следующем коде:
TestStructure* test_struct = new TestStructure[element_count];
for (int i = 0; i < element_count; i++)
FillStructure(test_struct, i, i, i, i, i, i); // assigning 'i' for all elements
Long_t size_value = element_count * sizeof(TestStructure);
unsigned char* p_value = new unsigned char[size_value];
memcpy(p_value, test_struct, size_value);
Выходной массив символов содержит дополнительные поля между элементами:
sizeof(TestStructure) = 20. element_count = 10. size_value = 200. char array in the hex format:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
6c 6c 2f 6c
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0
6f 70 74 2f
2 0 0 0
...
Пожалуйста, объясни мне. Добавляет ли динамический массив прокладки между элементами или оператор sizeof показывает неправильный размер структуры?
PS Я использую GCC 5.4.0 (Ubuntu 5.4.0-6ubuntu1~16.04.2).
РЕДАКТИРОВАТЬ: я использую этот код в макросе с интерпретатором ROOT CINT с скомпилированной библиотекой GCC. Извините, похоже, эта ошибка связана не с GCC, а с ROOT CINT.
EDIT2: Да, в моем макросе ROOT (выполняется интерпретатором CINT) sizeof(TestStructure) возвращает 24, и после этого, когда я вызываю функцию скомпилированной библиотеки GCC (содержащей фрагмент кода, перечисленный выше), sizeof(TestStructure) возвращает 20 в скомпилированная функция.
1 ответ
Хотя компилятор может добавить упаковку в конец struct
Компилятор абсолютно не может добавить дополнительную упаковку между элементами при создании массива.
Для массива TestStructure[n]
адрес элемента i(th) должен быть TestStructure + i * sizeof TestStructure
, Если бы это было не так, то арифметика указателей ужасно сломалась бы.