簡體   English   中英

ARM上的C ++ struct成員對齊和打包要求

[英]C++ struct member alignment and packing requirements on ARM

我想要使​​結構形式/布局更“定義/修復”而不是“由編譯器自行決定”。 在x86_64和ARMv7-A體系結構之間進行通信時,將共享結構布局。 是的,它一般不可移植,但對於這種更受限制的情況,字節序是相同的(如果決定在不同的平台上使用,則可以轉換)。

ARMv7-A上是否存在不同數據類型/大小的對齊要求? (即濫用它們是未定義的行為)

或者它可以將它們打包成任何對齊方式? (即它是所有定義的行為)

一些比對比其他比對更好嗎?

我一直在閱讀關於ARM的打包/對齊要求,但不幸的是我注意到它與我的架構有點過時了。 http://www.aleph1.co.uk/chapter-10-arm-structured-alignment-faq

我一直在這兩種體系結構上使用這樣的標題:

#pragma pack(4)
struct foo
{
  uint8_t bar1;        // 1 byte, the 3 padding bytes
  std::array<double,1> bar2;   // 8 bytes
};
#pragma pack()

我正在為ARM使用GCC交叉編譯器: gcc -Wall -Wextra -Wcast-align -march=armv7-a -mfloat-abi=softfp -mfpu=neon -mtune=cortex-a9

當我打電話給foo abc; abc.bar2.data(); foo abc; abc.bar2.data(); ,並使用-fsanitize=undefined -fsanitize=address編譯會產生運行時錯誤:

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
              ^

我喜歡相信殺菌劑,這讓我覺得這很糟糕。 但是,如果我關閉殺菌劑並將優化調整到-O3 ,它表現還可以。 然而,我可能只是(非)幸運,這種未定義行為的情況似乎工作正常。 我記得早些時候我在打包(1)而不是pack(4)時觸發了-Wcast-align警告,但是我不記得我是如何訪問它來觸發它的。 我認為這也表明它可能是未定義的行為。 地址清除器和-Wcast-align是否表明該體系結構的未定義行為,即使它似乎有效?

是否建議增加到pack(8)來修復未定義的行為? 不幸的是,它增加了內存使用量。

最后, pragma pack(n)__attribute__((packed))是每個結構實體的首選方式嗎? __attribute__((packed))是GCC擴展名,遺憾的是無法指定包大小。)

對於未對齊訪問,將始終存在性能損失,因為對於單次訪問,​​您可能必須觸摸兩個緩存行。

我想對於未對齊訪問(減速或故障)的確切反應不是由體系結構描述定義的,而是可能留給實現。

當你只遵循按結構尺寸降序排序結構中字段的舊習慣時,所有今天的C(++)編譯器都將生成相同的內存布局。 我會建議那條讓你免於悲痛的路線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM