gpt4 book ai didi

c++ - C++ 17中函数参数的指针对齐

转载 作者:行者123 更新时间:2023-12-02 11:15:06 25 4
gpt4 key购买 nike

我看到C++ 17为需要比std::align_val_t自然提供更大对齐的对象引入了new对齐的new表达式。很好,但是让我思考:

为什么指针对齐不属于指针类型?

例如:

long foo(long *x) {
return *x; // here, the compiler do an aligned load
// correct as (long*) is expected to be aligned
}

将假定指针在64位上对齐(在我的机器上)。
但是,如果执行以下操作,编译器不会警告我:
long bar(char *x) {
return foo((long*) x); // here, the compiler do an aligned load, risky!
}

long pop(char *z) {
return bar(z + 1); // here, the compiler do an aligned load too!
}

我通过从打包的结构传递指向字段的指针来设法得到警告:
struct ugly {
char x;
long y;
} __attribute__((packed));

long kun(ugly *a) {
return a->y; // here, the compiler do an unaligned load, correct!
}

long zip(ugly *a) {
return foo(&a->y); // here, the compiler do an aligned load, incorrect!
// but warns me about it.
}

但是,为什么它不是类似于 const_cast的错误呢?

该标准对对齐有何说明?

是否所有的编译器都做不正确的假设,还是给函数未对齐的指针是未定义/实现定义的行为?

您可以在此处查看它们的运行情况: https://godbolt.org/g/9ddbiq

编辑:修复了代码片段,并提供了Godblot链接。

最佳答案

What does the standard says with regard to alignment?



这很简单:存在的每个 T类型的对象都具有正确的对齐方式。

如果您使用放置 new并提供未充分对齐的指针,则会导致UB。如果替换 new分配器并为所分配的类型提供不足对齐的指针,则会导致UB。如果 std::allocator<T>::allocate返回的指针与 T的对齐方式不正确,则会导致UB。依此类推。

未定义的行为不需要编译失败。

关于c++ - C++ 17中函数参数的指针对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50648057/

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