簡體   English   中英

如何指定一個指向未對齊的int的指針?

[英]How to specify a pointer which points to unaligned int?

struct Intx4 {
  int data[4];
};

Intx4 loadIntx4(void const *p) {
  auto up alignas(1) = (int const *)p; // Does this line correct? (compiled ok in clang)
  Intx4 r;
  for (int i = 0; i < 4; i++) r.data[i] = up[i];
  return r;
}

我也嘗試了以下方法,它們都無法用clang編譯:

int const *up alignas(1) = (int const *)p;
auto up = (int const alignas(1) *)p;

要讀取未對齊的整數:

int i;
void* ptr_to_unaligned;
...
memcpy (&i, ptr_to_unaligned, sizeof(i));

C ++中沒有未對齊的整數類型,因此您必須使用void*

根據C ++ 11草案(n4296),嘗試將void的指針轉換為具有對齊要求的類型會導致未定義的行為

從5.2.9靜態強制轉換 §13: 可以將類型為“指針指向cv1無效”的prvalue轉換為類型為“ pointer to cv2 T”的prvalue,其中T是對象類型,而cv2是與cv相同的限定詞,或大於cv-qualification大於cv1 ...如果原始指針值表示內存中某個字節的地址A並且A滿足T的對齊要求 ,則所得指針值表示與原始指針值相同的地址,則是,A。其他任何此類指針轉換的結果均未指定 (強調我的)

我知道您使用的是顯式強制轉換 (或C樣式強制轉換 ),但5.4顯式強制轉換表示: const_cast(5.2.11),static_cast(5.2.9),static_cast和const_cast,可以使用顯式類型轉換的強制轉換表示符來執行reinterpret_cast(5.2.10)或reinterpret_cast后跟const_cast。 相同的語義限制和行為適用...

因此,在您的情況下,顯式static_cast<int const *>(p)static_cast<int const *>(p)

當您嘗試訪問未對齊的int指針時,某些體系結構(尤其是ARM體系結構)會被陷阱捕獲,如其他SO回答中所述

要以未對齊的方式使用整數,請將__packed放在整數指針聲明的前面:

__packed int *pi; // pointer to unaligned int

C和C ++代碼中未對齊的指針

暫無
暫無

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

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