2

让我们考虑一下我已经定义了一个内存区域,例如(注意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)- 也许将其定义为指针数组?

4

1 回答 1

2

不能保证myMemoryArea会适当地对齐。根据您的 CPU 和操作系统以及编译器,您可能会遇到崩溃或访问未对齐数据的速度非常慢。(另请参阅:解决困扰我的 C 面试问题中的内存对齐问题)。

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

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

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

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

于 2013-03-27T10:21:05.187 回答