C++ 打包包含字符串的结构

C++ 打包包含字符串的结构,c++,string,gcc,padding,packed,C++,String,Gcc,Padding,Packed,我刚学会了填充,我试着做一些测试, 我尝试打包此结构: 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 fiel

我刚学会了填充,我试着做一些测试, 我尝试打包此结构:

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;

这是否意味着不能打包包含
字符串的结构?还有别的办法吗?如果是这样,它会影响性能吗?

一个好的经验法则是将您的成员从最大到最小排序。这样,您的数据就对齐了,并且(通常)没有间隙。例如,在VS2013上,对于x64目标,以下布局需要112字节而不是128字节:

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

但是,对于x86目标,这只会为您节省4个字节。这是否以及如何影响您的性能取决于许多其他因素,因此只能通过测量来确定。

“这是否意味着字符串无法打包?”显然,他们不能。你可能误解了C++的代码> STD::字符串实际上是。它们不同于
char[]
数组。
std::string
对象将包含指针,根据CPU的不同,这些指针可能需要对齐以获得最佳性能,或者只是为了避免崩溃。其他类在打包时不能出现并回顾性地修改它们的对齐需求。为什么要首先使用打包?你想得到什么?为了获得最佳性能,请将布局留给编译器,除非您有很好的理由自行控制。@Othman:未对齐的数据访问可能会因各种原因影响性能:首先,指令可能需要更多时间(不确定x86/x64是否如此)和/或您的数据可能会在两个单独的缓存线中结束。另一方面,如果您必须迭代这些结构的非常大的数组,并且由于更密集的打包,必须从主存加载更少的数据,则可能会提高您的性能。谢谢,我可以理解为什么这是一个好规则,但是有没有编译器可以像这样对结构进行重新排序??因为我想我会为此创建一个gcc扩展,但如果它已经存在,最好不要浪费时间that@OthmanC++标准不允许编译器重新排序成员变量,请参阅@ AMDN:谢谢!我也这么想,但不太确定。