【问题标题】:Packing a struct that contains a string打包一个包含字符串的结构
【发布时间】:2015-04-03 17:22:24
【问题描述】:

我刚刚了解了填充,我正在尝试对其进行一些测试, 我试图打包这个结构:

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 的结构不能被打包?还有其他方法吗?如果是这样会影响性能吗?

【问题讨论】:

  • “这是否意味着字符串不能被打包?” 显然不能。您可能对 C++ std::strings 的实际含义有误解。它们不同于char[] 数组。
  • std::string 对象将包含指针 - 取决于 CPU - 可能需要对齐以获得最佳性能,或者只是为了避免崩溃。其他类不能出现并在打包时回顾性地修改它们的对齐需求。
  • 一开始为什么要使用packed?你想得到什么?为获得最佳性能,请将布局留给编译器,除非您有充分的理由自行控制。
  • @Othman:未对齐的数据访问可能会因各种原因影响您的性能:首先,指令可能需要更多时间(不确定 x86/x64 是否是这种情况)和/或您的数据可能会结束在两个单独的缓存行中。
  • 另一方面,如果您使用例如必须遍历这些结构的非常大的数组,并且 - 由于更密集的打包 - 必须从主内存加载更少的数据。

标签: c++ string gcc padding packed


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢 我明白为什么这是一个很好的规则,但是有没有编译器可以像这样重新排序结构?因为我想我会为此创建一个 gcc 扩展,但如果它已经存在,最好不要浪费我的时间
  • @Othman:C++ 标准通常不允许编译器重新排序成员变量,请参阅stackoverflow.com/questions/916600/…
  • @amdn:谢谢!我也是这么想的,但不太确定。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
相关资源
最近更新 更多