gpt4 book ai didi

c++ - 在 C++ 中,内存对齐如何用于对结构的引用?

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:23 25 4
gpt4 key购买 nike

我发现了一个我在将缓冲区转换为本身包含数据缓冲区的结构引用时并没有意识到的发现。

我认为最好用代码示例来解释这个示例:

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] 指的是未分配的、未定义的内存,因为您已将结构从第一个缓冲区中复制出来。

关于c++ - 在 C++ 中,内存对齐如何用于对结构的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27183969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com