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



我通过为 1 个大块中的中间数组实际元素分配空间来实现一个交错多维数组。在处理这个问题时,我想我必须考虑到正在存储的元素的对齐方式,以防万一。但我不确定是否需要进行这种安全检查,所以我来问:指针的大小会让任何其他类型的东西保持一致吗?

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

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

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

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

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

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

因此,下面是一个需要填充的示例:

struct Element
{
    unsigned long long x;
    ...
};
void* ptrArray[TOTAL_SIZE];

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

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

如果您希望完全避免填充,那么每次需要访问(读取或写入)该特定元素时,都必须从数组中memcpy元素并将其放入数组中。

相关内容

最新更新