Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;臂上的结构件对齐和包装要求_C++_Gcc_Arm_Memory Alignment_Address Sanitizer - Fatal编程技术网

C++ C++;臂上的结构件对齐和包装要求

C++ C++;臂上的结构件对齐和包装要求,c++,gcc,arm,memory-alignment,address-sanitizer,C++,Gcc,Arm,Memory Alignment,Address Sanitizer,我想让结构形式/布局更“定义/固定”,而不是“由编译器自行决定”。在x86_64和ARMv7-A体系结构之间通信时,结构布局将共享。是的,一般来说它是不可移植的,但对于这种更受限制的情况,endianness是相同的(如果决定在不同的平台上使用,可以进行转换) ARMv7-A上的不同数据类型/大小是否有对齐要求?(即误用它们是未定义的行为) 或者它可以将它们打包成任何对齐方式吗?(即,它是所有定义的行为) 某些路线的性能是否优于其他路线? 我一直在阅读ARM的打包/对齐要求,但不幸的是,我注意到

我想让结构形式/布局更“定义/固定”,而不是“由编译器自行决定”。在x86_64和ARMv7-A体系结构之间通信时,结构布局将共享。是的,一般来说它是不可移植的,但对于这种更受限制的情况,endianness是相同的(如果决定在不同的平台上使用,可以进行转换)

ARMv7-A上的不同数据类型/大小是否有对齐要求?(即误用它们是未定义的行为)

或者它可以将它们打包成任何对齐方式吗?(即,它是所有定义的行为)

某些路线的性能是否优于其他路线?

我一直在阅读ARM的打包/对齐要求,但不幸的是,我注意到它与我的体系结构相比有点过时。

我在两种体系结构上都使用了这样的头文件:

#pragma pack(4)
struct foo
{
  uint8_t bar1;        // 1 byte, the 3 padding bytes
  std::array<double,1> bar2;   // 8 bytes
};
#pragma pack()
我喜欢相信消毒剂,它让我觉得这很糟糕。但是,如果我关闭消毒剂并将优化设置调到
-O3
,它的行为正常。然而,我可能只是(不)幸运,而这种未定义行为的情况似乎很好。我记得早些时候我在打包(1)而不是打包(4)时触发了-Wcast align警告,但我不记得我是如何访问它以触发该警告的。我认为这也表明这可能是未定义的行为地址消除器和-Wcast-align指示此体系结构的未定义行为是真的吗,即使它看起来有效?

是否建议增加到pack(8)以修复未定义的行为?不幸的是,它确实增加了内存使用量


最后,对于每个结构实体,
pragma pack(n)
\uuuuu attribute\uuuuuuuuuuuuu((packed))
是做这件事的首选方法吗?
\uuuuuuuu attribute\uuuuuuuuuuuu((packed))
是一个GCC扩展,不幸的是无法指定包大小。)

对于未对齐的访问,总是会有性能损失,因为对于单个访问,您可能需要接触两条缓存线

我猜对未对齐的访问(减速或故障)的确切反应并不是由体系结构描述定义的,而是由实现来定义的


如果您只是遵循按大小降序排列结构中字段的旧习惯,那么今天所有的C++编译器都将生成相同的内存布局。我建议您采用这种方法来避免悲伤。

在ARM上,是否出错取决于页面表格设置;对强顺序或设备内存的未对齐访问将始终出错,即使对正常内存的未对齐访问正常工作。对于“正常”应用程序,不太可能导致问题,但在系统级软件中可能会很有趣。谢谢。但是,顺序确实很重要,不能任意排序。在结构的开头应该有一个小的校验和,它不能改变位置。因此,问题就变成了:如何找到实现的ABI的对齐要求?@Isogen74:页面错误/缓存未命中中的“错误”?还是像I/O故障一样?请定义术语“强有序”、“设备内存”、“正常内存”。谢谢。页面错误(或总线错误)中的错误;例如,在Linux平台上,它通常作为SIGBUS可见。很难给出一个关于它们是什么的简短回答-我建议您非常简要地阅读ARMv7-a体系结构手册,“正常”是应用程序通常看到的系统RAM(允许缓存、读写重新排序、访问合并、未对齐访问)。在映射内存映射寄存器的方式上,设备内存和强顺序是不同的变体,因此大多数“聪明”的事情都是不可能的(没有合并、未对齐、重新排序,但设备可以缓冲在写缓冲区中)。对于应用软件,您通常可以假设您将获得“正常”内存,对于系统软件,这取决于您正在做什么。
runtime error: member call on misaligned address 0xbeeb0c44 for type 'struct array', which requires 8 byte alignment
0xbeeb0c44: note: pointer points here
  01 00 00 00 03 00 00 00  03 00 00 00 01 00 00 00  f4 0d eb be fc 0d eb be  c0 a5 00 00 00 00 db 4b
              ^
/sysroot.../usr/include/c++/5.2.0/array:230:32: runtime error: reference binding to misaligned address 0xbeeb0c44 for type 'const double', which requires 8 byte alignment
0xbeeb0c44: note: pointer points here
  01 00 00 00 03 00 00 00  03 00 00 00 01 00 00 00  f4 0d eb be fc 0d eb be  c0 a5 00 00 00 00 db 4b
              ^