2014-01-09 4 views
2

У меня есть struct:минимизировать общую память STRUCT

struct st 
{ 
    short a; 
    int *b; 
    char ch; 
}; 

short составляет 2 байта
байт в 64
char составляет 1 байт

Все вышеперечисленное вместе должны дать мне 11 байт. Но если я делаю sizeof(st), я получаю 24 байта. Почему struct использует больше памяти и как уменьшить память до 11 байтов?

+2

Байт-выравнивание? – zero298

+0

Спасибо, что я буду искать по этому поводу – Luka

+2

http://en.wikipedia.org/wiki/Data_structure_alignment –

ответ

2

pragma pack обычно используется, но его не так портативно, как хотелось бы. Вот документацию на него:

Оба обеспечивают #pragma pack(n), push и pop.

В отсутствие упаковки, попробуйте переупорядочивая struct:

struct st 
{ 
    int *b; 
    short a; 
    char ch; 
}; 

Вы должны быть осторожны, о доступе к данным, если его упакованная. Вероятно, вам понадобится memmov (или memcpy), чтобы обеспечить переносимость на всех платформах. Если вы этого не сделаете, вы можете столкнуться с ошибкой EXCEPTION_DATATYPE_MISALIGNMENT в Windows или с ошибкой SIGBUS в Linux.

У Microsoft хорошая запись на нем по номеру Windows Data Alignment on IPF, x86, and x64.

-Wstrict-aliasing и -Wcast-align помогут вам найти больные пятна.

+0

с использованием пакета pragma: a) приведет к любому удару по скорости, б) получу ли это ровно 11 байтов? – Luka

1

Я знаю, что это уже поздно, и я знаю, что вы уже приняли ответ, но это также может работать. Вы получите 12 байт. НЕ 11. Я не уверен, что он переносимый, но я думаю, что это так. Смотрите здесь: http://en.cppreference.com/w/cpp/language/alignas

#include <iostream> 

struct alignas(char) aligned_struct 
{ 
    short a; 
    int *b; 
    char ch; 
}; 


int main() 
{ 
    std::cout<<sizeof(aligned_struct); 
} 

EDIT:

VS2012 не включает alignas в их компилятором в соответствии с: http://msdn.microsoft.com/en-us/library/vstudio/hh567368(v=vs.110).aspx

Это, кажется, не нужно выше в VS2012, хотя. По какой-то причине, с указанным или без него, он все еще печатает 12:

struct aligned_struct 
{ 
    short a; 
    int* b; 
    char ch; 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    std::cout<<sizeof(aligned_struct); //prints 12 
    std::cin.get(); 
    return 0; 
} 
+0

Спасибо за ответ, как его скомпилировать в Visual Studio 2012? – Luka

+0

Добавлен пример для VS2012. – Brandon

Смежные вопросы