簡體   English   中英

內存對齊如何工作以引用C ++中的結構?

[英]How does memory alignment work for a reference to a struct in C++?

我做了一個發現,在將緩沖區強制轉換為本身包含數據緩沖區的結構引用時,我並沒有意識到。

我認為最好用一個代碼示例來說明此示例:

struct myStruct {
  int a;
  int b;
  char data[1];
};

#define TB_SIZE 5
char data[TB_SIZE] = {0x1, 0x2, 0x3, 0x4, 0x5};


void f(struct myStruct& dest) {
  dest.a = 33;
  memcpy(dest.data, data, TB_SIZE);
}

int main() {
  char buf[100];
  f(reinterpret_cast<struct myStruct&>(buf[0]));
  struct myStruct castStruct = reinterpret_cast<struct myStruct&>(buf[0]);

  printf("Src Values\n");
  for(int i = 0; i < TB_SIZE; ++i) {
    printf("0x%02x, ", data[i]);
  }
  printf("\nActual\n");
  for(int i = 0; i < TB_SIZE; ++i) {
    printf("0x%02x, ", castStruct.data[i]);
  }


  return 0;
}

這個簡單程序的輸出是:

Src Values
0x01, 0x02, 0x03, 0x04, 0x05, 
Actual
0x01, 0x02, 0x03, 0x04, 0x00,

在將緩沖區轉換為結構引用之后,當我在結構內部打印數據緩沖區時,似乎我們丟失了最后一個值,即。 castStruct [4]。

現在,我猜想這與結構對齊問題有關,但我不確定為什么。 如果我改為更改對指針的所有引用,則程序將按預期運行,另外,如果myStruct中只有一個整數,則在data []字段之前,程序也將按預期運行。 所以我的問題很簡單,內存對齊如何在C ++中引用結構?

因此,我認為這種行為是預期的-實際上,您在這一行中獲得的收益超出了合理預期:

struct myStruct castStruct = reinterpret_cast<struct myStruct&>(buf[0]);

將討厭的緩沖區的內容復制到新的結構castStruct中-編譯器僅保證復制該結構的實際元素-特別是僅復制單個字符數組。 您所期望的只是得到第一個字符(由於對齊而發生的情況,還會復制另外幾個字節)。 請注意,castStruct.data [2]引用了未分配的,未定義的內存,因為您已將結構復制到第一個緩沖區之外。

暫無
暫無

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

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