C可以将指针与任何其他数据类型对齐吗?

时间:2014-12-31 04:50:24

标签: c arrays pointers memory-alignment

我通过为中间数组分配空间以及 1 大块中的实际元素来实现锯齿状多维数组。在处理这个问题时,我认为我必须考虑到存储元素的对齐,以防万一。但是我不确定是否需要进行这种安全检查,所以我已经开始问:指针的大小是否会保持对齐任何其他类型?

简而言之:给出来自对malloc 的调用的连续内存空间,如下所示:

| ARRAY OF POINTERS | ALIGN PADDING | ARRAY OF AN ARBITRARY ELEMENT TYPE |

当第一个数组由指针组成时,我真的需要填充吗?是否有必要填充的情况?

2 个答案:

答案 0 :(得分:2)

您尚未指定回答此问题所需的所有必要详细信息。

所以这是一个需要填充的例子:

struct Element
{
    unsigned long long x;
    ...
};

void* ptrArray[TOTAL_SIZE];

如果您在32位平台上运行 AND ,您已经定义了奇数个指针,那么您将需要一个4字节的填充以确保8字节的对齐变量在每个元素的开头。

另外,请注意,如果要在数组中存储多个元素,那么元素类型本身的大小必须是8个字节的倍数才能使其正常工作。

如果你想完全避免填充,那么每次你需要访问(读或写)特定元素时,你必须memcpy一个元素来自和进入数组。

答案 1 :(得分:2)

C标准没有明确保证对象指针具有最严格的对齐要求。在某些系统上,long double可能有更严格的对齐要求;在其他系统上,函数指针可能有更严格的对齐要求。

但是,只需稍加注意,您就可以确定对齐要求。你需要决定你需要答案的便携性和自动化程度。通过编译代码和找到答案很容易找到答案。为任何类型创建一个自动执行的万无一失的自动方式要困难得多,尤其是因为任意元素类型可能比对象指针更大或更小。