gpt4 book ai didi

c - 将内存区域视为结构数组时的对齐注意事项

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

假设我已经定义了一个内存区域,例如(注意:uint8 表示unsigned char):

uint8 myMemoryArea[1024];

我有一个像这样的结构:

typedef struct
{
uint8 * ptrToMyVar;
uint8 otherVar;
} myStruct_type;

我想将 myMemoryArea 视为 myStruct_type 的数组,因此我想对内存区域执行随机访问,例如:

myStruct_type * myPtrToStruct = (* myStruct_type)(&(myMemoryArea[ELEMENT_TO_ACCESS * sizeof(myStruct_type)]));
myPtrToStruct->otherVar = 2;

这个机器独立代码吗?我应该期待对齐或填充的麻烦吗?我想只要我使用 sizeof 就可以在这里填充。

我是否应该确保 myMemoryArea 从可被 sizeof(* char) 整除的地址开始 - 也许将其定义为指针数组?

最佳答案

不能保证 myMemoryArea 会适当对齐。根据您的 CPU、操作系统和编译器,您可能会崩溃或访问未对齐的数据非常缓慢。 (另请参阅:Solve the memory alignment in C interview question that stumped me)。

考虑如果您的变量在此上下文中声明会发生什么:

double d1;
uint8 c1;
uint8 myMemoryArea[1024];
uint8 c2;
douebl d2;

有充分的理由期望 d1 正确对齐;如果不是,编译器会让你非常失败。没有理由期望对 c1 有任何不寻常的处理;单个字节可以存储在任何对齐方式上。 myMemoryArea 数据也不必特别对齐;它周围可能没有空间,而且它很可能位于一个奇怪的地址。 c2 变量不需要特殊处理; d2 将正确对齐(并且数据中可能有 6 个字节未使用的空间。

如果 myMemoryArea 是奇字节对齐,并且您使用 RISC 机器访问内存结构,您很可能会遇到 SIGBUS 错误。在 Intel 机器上,您的访问速度可能会非常慢。

关于c - 将内存区域视为结构数组时的对齐注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15655748/

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