【发布时间】:2016-06-26 09:37:08
【问题描述】:
以下场景是否有未定义的行为?
void do_stuff(const int *const_pointer, int *pointer) {
printf("%i\n", *const_pointer);
*pointer = 1;
}
int data = 0;
do_stuff(&data, &data);
如果这是未定义的行为,如果编译器假定const_pointer 指向的值永远不会改变,则可能会导致问题。在这种情况下,它可能会重新排序do_stuff 中的两条指令,从而将行为从预期的printf("0") 更改为printf("1")。
【问题讨论】:
-
没有。
const不能这样工作。如果这样做,那将比完全没用更糟糕。指针上的const意味着无法通过此指针更改对象,而不是根本无法更改。 -
@n.m.有时有一种方法可以告诉编译器“我保证指针指向的数据已经初始化并且不会再被修改”,例如在函数中多次计算相同的表达式时,并且如果表达式的输入确实是常量,编译器可以确保它只计算一次。虽然
const不能以这种方式工作是对的,但我认为如果这样做的话,它不会“比完全没用更糟糕”。 -
@hvd:这就是 C99 中的
restrict的用途。不完全是这样(这个概念更笼统),但结合const,它也打算产生这种效果。 -
@hvd:是的,这就是我所说的更笼统的概念的意思。
restrict并不是说指向的对象是不可修改的。相反,它有助于编译器确定指针对象(可能是可修改的)是否实际上被一些代码修改。无论是否存在const,它都应该有助于编译器优化代码。我想说它达到了与建议的“硬 const”相同的效果,但以更通用的方式。 -
@hvd 显然是 restrict + const 你可以告诉编译器对象不会被修改:stackoverflow.com/a/28800332/4082723
标签: c pointers constants undefined-behavior