2015-04-03 2 views
4

я только узнал о дополнении, и я пытался сделать некоторые тесты по этому поводу, я попытался собрать эту структуру:упаковка структуры, которая содержит строку

struct B { 
     int a,b,c; 
     string s; 
     char x; 
     string t; 
     char y; 
     string u; 

}__attribute__((packed)) ; 

Но я получаю это предупреждение:

warning: ignoring packed attribute because of unpacked non-POD field 'std::string B::u' 
     string u; 

Означает ли это, что структуры, содержащие strings, не могут быть упакованы? Есть ли другой способ сделать это? если это влияет на производительность?

+0

_ «Означает ли это, что строки не могут быть упакованы?» _ Очевидно, они не могут. Вероятно, у вас есть неправильное представление о том, что такое C++ 'std :: strings'. Они отличаются от 'char []' массивов. –

+0

Я не хотел упаковывать строку, я хотел упаковать структуру, содержащую строку –

+1

. Объекты 'std :: string' будут содержать указатели, которые в зависимости от процессора могут быть выровнены для оптимальной производительности или просто избежать аварии. Другие классы не могут прийти и ретроспективно изменить свои потребности в выравнивании при их упаковке. –

ответ

2

Хорошее эмпирическое правило - сортировать своих членов от самых больших до самых маленьких. Таким образом ваши данные выравниваются и (как правило) не имеют пробелов. Например. на VS2013 в течение 64 нацелит следующий макет требует 112 вместо 128 байт:

struct B { 
    string s,t,u; 
    int a,b,c;  
    char x,y; 
}; 

Для мишени x86, однако, это только экономит Вам 4 байта. Независимо от того, влияет ли это на вашу эффективность, зависит от многих других факторов, что ее можно определить только путем измерения.

+0

Спасибо, я могу понять, почему это хорошее правило, но есть ли какие-либо компиляторы, которые могут переупорядочить такие структуры? Поскольку я думаю, что я создам расширение gcc для этого, но если он уже существует, лучше не терять время на это –

+1

@Othman: стандарт C++ не позволяет компилятору изменять порядок переменных-членов в общем случае, см. Http: // stackoverflow.com/questions/916600/can-ac-compiler-re-order-elements-in-a-struct – amdn

+0

@amdn: Спасибо! Я тоже так думал, но не был уверен. – MikeMB

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