我已多次阅读过,在C或C++代码中强制执行const-correctness不仅是一个关于可维护性的好习惯,而且它可能允许编译器执行优化.但是,我也完全相反 - 它根本不会影响性能.
因此,您是否有一些示例,其中const正确性可以帮助您的编译器提高程序的性能?
我知道在可能的情况下,在通过引用或指针传递参数时,应尽可能使用const关键字.如果我指定参数是常量,编译器可以做的任何优化吗?
可能有几种情况:
功能参数:
常量参考:
void foo(const SomeClass& obj)
Run Code Online (Sandbox Code Playgroud)
Constant SomeClass对象:
void foo(const SomeClass* pObj)
Run Code Online (Sandbox Code Playgroud)
并且指向SomeClass的常量指针:
void foo(SomeClass* const pObj)
Run Code Online (Sandbox Code Playgroud)
变量声明:
const int i = 1234
Run Code Online (Sandbox Code Playgroud)
函数声明:
const char* foo()
Run Code Online (Sandbox Code Playgroud)
每个提供什么样的编译器优化(如果有的话)?
经过大量的谷歌搜索后,我发现了很多关于标记函数及其参数的内容const,但没有关于标记变量的指南const.
这是一个非常简单的例子:
#include <string>
#include <iostream>
void example(const std::string& x) {
size_t length = x.length();
for (size_t i = 0; i < length; ++i) {
std::cout << x.at(i) << std::endl;
}
}
int main() {
example("hello");
}
Run Code Online (Sandbox Code Playgroud)
为什么不做
size_t length = x.length();
Run Code Online (Sandbox Code Playgroud)
const喜欢
const size_t length = x.length();
Run Code Online (Sandbox Code Playgroud)
按照惯例?
我知道这么小的一个简单的例子确实没有给这个带来任何巨大的好处,但它似乎对于一个更大的代码库有帮助,你可能会意外地改变你不应该变异的变量.
尽管有这样的好处,但我并没有真正看到它使用那么多(在我见过的C++代码库中)或者提到的几乎和函数及其参数一样多const.
除了必须输入5个额外字符外,还有一些缺点吗?我在这个话题上找不到太多东西,如果这是一个有这么多争议的问题,我不想在脚下射击.
什么时候我应该做一个功能private,为什么这是个好主意?
我理解 - const限定数据类型的行为.不过,我很好奇,如果由于合格变量的过度或不足而导致任何表现获得或损失const.我特别想到在隔离的代码块中声明和使用的变量.例如,类似于:
const qreal padding = CalculatePadding();
const QSizeF page_size = CalculatePagePreviewSize(padding);
const QRectF content_rect = CalculatePagePreviewContentRect(page_size);
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_);
const QFont page_number_font = CalculatePageNumberFont();
const QFontMetrics metrics(page_number_font);
Run Code Online (Sandbox Code Playgroud)
假设我const在所有这些方面只需要合格的方法(以及更多.)在声明它们时是否有任何性能提升const?或者,相反,这实际上是否会损害性能?
我很好奇两个运行时性能(我猜这没有区别,因为const它只是一个编译时检查 - 有人可以确认吗?)和编译时性能.我对c ++没有足够的经验来感受这一点,并且我想知道const当所有其他事情(可维护性等)相等时我是否应该在过度或不足的情况下犯错.