gpt4 book ai didi

c++ - const-correctness 是否给编译器更多的优化空间?

转载 作者:IT老高 更新时间:2023-10-28 12:05:26 26 4
gpt4 key购买 nike

我知道它提高了可读性并减少了程序出错的可能性,但是它对性能的提高有多大?

顺便说一句,引用和 const 指针之间的主要区别是什么?我会假设它们以不同的方式存储在内存中,但如何呢?

最佳答案

[编辑:好的,所以这个问题比我一开始想的要微妙。]

声明指向 const 的指针或引用的 const 永远不会帮助任何编译器优化任何东西。 (尽管请参阅此答案底部的更新。)

const 声明仅指示标识符将如何在其声明的范围 内使用;它并不是说底层对象不能改变。

例子:

int foo(const int *p) {
int x = *p;
bar(x);
x = *p;
return x;
}

编译器不能假设 *p 没有被 bar() 的调用修改,因为 p 可能是(例如)一个指向全局 int 的指针,bar() 可能会修改它。

如果编译器足够了解 foo() 的调用者和 bar() 的内容,它可以证明 bar()不修改 *p,那么 它也可以在没有 const 声明的情况下执行该证明

但这通常是正确的。因为 const 只在声明的范围内起作用,所以编译器已经可以看到您在该范围内如何处理指针或引用;它已经知道你没有修改底层对象。

所以简而言之,所有 const 在这种情况下所做的就是防止你犯错误。它不会告诉编译器任何它不知道的东西,因此它与优化无关。

调用 foo() 的函数呢?喜欢:

int x = 37;
foo(&x);
printf("%d\n", x);

编译器能否证明这打印出 37,因为 foo() 采用 const int *

没有。即使 foo() 采用指向 const 的指针,它也可能会丢弃 const 并修改 int。 (这不是未定义的行为。)在这里,编译器通常不能做出任何假设;如果它对 foo() 有足够的了解来进行这样的优化,它就会知道即使没有 const

const 唯一可能允许优化的情况是这样的:

const int x = 37;
foo(&x);
printf("%d\n", x);

在这里,通过任何机制修改 x(例如,通过获取指向它的指针并丢弃 const)就是调用未定义行为。所以编译器可以自由地假设你不这样做,它可以将常量 37 传播到 printf() 中。这种优化对于您声明 const 的任何对象都是合法的。 (实际上,您从不引用的局部变量不会受益,因为编译器已经可以看到您是否在其范围内对其进行了修改。)

要回答您的“旁注”问题,(a) const 指针是指针; (b) 一个 const 指针可以等于 NULL。您是正确的,内部表示(即地址)很可能是相同的。

[更新]

作为 Christoph在评论中指出,我的回答不完整,因为它没有提到 restrict

C99 标准的第 6.7.3.1 (4) 节说:

During each execution of B, let L be any lvalue that has &L based on P. If L is used to access the value of the object X that it designates, and X is also modified (by any means), then the following requirements apply: T shall not be const-qualified. ...

(这里 B 是一个基本 block ,P 是一个指向 T 的限制指针,在其范围内。)

所以如果一个 C 函数 foo() 是这样声明的:

foo(const int * restrict p)

...那么编译器可能假设在 p 的生命周期内不会对 *p 进行任何修改——即,在foo() 的执行——因为否则行为将是未定义的。

因此,原则上,将 restrict 与指向 const 的指针相结合可以启用上面忽略的两种优化。我想知道是否有任何编译器实际上实现了这样的优化? (至少 GCC 4.5.2 没有。)

请注意,restrict 仅存在于 C 中,而不存在于 C++(甚至 C++0x)中,除非是作为特定于编译器的扩展。

关于c++ - const-correctness 是否给编译器更多的优化空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6313730/

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