我理解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);
假设我只需要const
- 所有这些的合格方法(以及更多。)在声明所有const
时是否有任何性能提升?或者,相反,这实际上是否会损害绩效?
我对运行时性能感到好奇(我猜这没有区别,因为const
完全是编译时检查 - 有人可以确认吗?)并编译时间表现。我对c ++没有足够的经验来感受这一点,并且我想知道当所有其他事情(可维护性等)相等时,我是否应该过度或不足const
。
答案 0 :(得分:23)
const
主要是编译时的事情,但是,将const
声明为某些内容有时会允许进行某些优化。如果有问题的代码不是性能瓶颈,我不会担心它,只是按预期使用const
:产生更清晰的代码并防止自己做蠢事。
答案 1 :(得分:3)
在我的(有限的)体验中,const可以相当多地伤害性能(惊喜!) 也就是说,在处理容器类时要注意连接的作用:对于数组,一旦访问单个元素进行读取,它可能只是强制编译器创建容器的副本(例如,数组)...这是在我正在处理的代码中找到一个巨大的痛苦。
答案 2 :(得分:2)
我的理解是编译器可以使用const来潜在地优化性能,但不能保证这样做;但是,不应该有性能下降。它可能会影响运行时行为(即:编译器可以将const变量放在只读内存页上)。
它不应该对性能产生重大影响,但是我更加难以使用它来简化代码维护。不过我的意见只是。
答案 3 :(得分:1)
虽然答案在技术上是“是”,但实际答案是否定的。确实,在某些情况下,编译器可以通过考虑给定值不能改变或者方法不会修改拥有对象来执行代码优化。然而,这些将是情境案例,并且在优化的杂草中如此令人难以置信地远远低于预先考虑它的几乎肯定是错误的。
答案 4 :(得分:0)
const
可以帮助您在编译时捕获错误。然而,因为有这个称为const_cast
的东西,你总是可以改变任何变量的常量,所以编译器真的无法摆脱优化任何东西。 (您也可以使用c样式转换来摆脱可能使优化无效的常量。)