【发布时间】:2016-07-02 13:53:19
【问题描述】:
我看过不少下面的代码(抽象例子):
char* byteBlockPtr;
long* alignedPtr = NULL;
/* ... */
/* aligning pointer by long boundary */
while (!ALIGNED(byteBlockPtr))
{
byteBlockPtr++;
}
alignedPtr = (long*)byteBlockPtr;
/* ... */
/* do stuff with memory */
alignedPtr++; /* go to next block */
/* ... */
这很容易理解,因为从 char 指针转换为更严格的指针类型(在本例中为 long 指针)需要对齐相同。
同样适用于 void 指针吗?
如果一个人正在编写自己的 memset,是否必须遵循任何一般规则才能不破坏指针的对齐方式?
关于 char 和 void 指针以及其他指针,如果有的话,指针别名和对齐之间有什么联系?例如,如果按照标准将 void 指针隐式转换为任何其他指针类型,这是否意味着也可以保证满足对齐要求?
附:提前对超过 1 个问题表示抱歉,但显然我的知识存在差距,我不知道如何缩小范围。
【问题讨论】:
-
ALIGNED不是标准的。使用标准方法检查对齐。如果那是一些自定义宏,请显示它。 (旁注:名称选择不当,因为不清楚它检查哪个对齐方式)。 -
@Olaf,就像我说的,这是一个抽象的例子。它只是检查指针是否与长边界对齐。我怀疑它的特定实现对手头的问题至关重要,但如果你不这么认为,我会更新帖子。
-
您是否阅读过关于此主题的各种帖子:stackoverflow.com/search?q=strict+aliasing?
-
AFAIK
char *和void *具有相同的内部表示,如果从void *转换为无效的T *,则行为未定义。 -
@melpomene 为什么?仅仅第一次分配它不应该是UB。之后再读是的。你能为此争论吗?请使用标准引用或良好的链接,带参数。
标签: c pointers memory-management strict-aliasing