【发布时间】: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