C++ 为什么很少有人输入正确的代码?const-correct代码编译得更好/更快吗?

C++ 为什么很少有人输入正确的代码?const-correct代码编译得更好/更快吗?,c++,c,const-correctness,C++,C,Const Correctness,I非常经常将指针作为函数args传递给只读args(例如structs等)。例如,在此构造函数中: Chunk::Chunk(const string& text, COLOR * background, COLOR * foreground); 我过去更喜欢这种方式(不是const-correct),因为我认为它更容易阅读。 然而,我开始觉得这是肮脏的,并改为: Chunk::Chunk(const string& text, const COLOR * const back

I非常经常将指针作为函数args传递给只读args(例如structs等)。例如,在此构造函数中:

Chunk::Chunk(const string& text, COLOR * background, COLOR * foreground);
我过去更喜欢这种方式(不是const-correct),因为我认为它更容易阅读。 然而,我开始觉得这是肮脏的,并改为:

Chunk::Chunk(const string& text, const COLOR * const background, 
                          const COLOR * const foreground);
一开始似乎很难理解,但直到你习惯了它。我的问题:

为什么没有人做得对?(我见过这样的小代码) 它更好/更小/更快

我知道有什么区别,但我真的不在乎不同的语义,因为任何阅读代码的人都可以看到arg是只读的。(谁会更改指针地址?)


我知道我可以使用引用来代替,但假设我不想使用引用(或者我使用的是纯C)。

常量正确性有助于编译器生成更快的代码。例如,如果将非常量指针传递给函数,编译器可能会假定该函数修改了引用的内存块

<>编辑:(来自Excel C++风格的40个新的工程难题、编程问题和解决方案)< /P> 将参数和/或返回值声明为const是否有助于编译器生成更优化的代码或改进其代码生成?

简言之,不,可能没有

为什么?为什么不?

编译器能做得更好的是什么?它能避免参数或返回值的副本吗?否,因为参数已通过引用传递,并且返回已通过引用传递。它能把x或某物的副本放入只读存储器吗?不,因为x和someY都生活在它的范围之外,来自和/或被给予外部世界。即使someY是在f本身中动态分配的,它和它的所有权也会交给调用者

但是,对于出现在f主体中的可能的代码优化又如何呢?由于const,编译器能否以某种方式改进它为f体生成的代码

仅仅因为x和someY被声明为常量并不一定意味着它们的位在物理上是常量。为什么不呢?因为任何一个类都可能有可变成员或其道德等价物,即成员函数中的const_类型转换。事实上,f本身中的代码可能会执行const_类型转换或C风格转换,从而将const声明变成谎言

有一种情况下,表示const实际上可能意味着什么,那就是当对象在其定义点处被设置为const时。在这种情况下,编译器通常可以成功地将这些“真常量”对象放入只读内存,特别是如果它们是POD,其内存映像可以在编译时创建,因此可以存储在程序的可执行映像本身中。这样的对象通俗地称为“ROM-able”


通常认为常量正确性有助于编译器生成更紧凑的代码。是的,const确实是一件好事,但这一条的要点是,const主要用于人类,而不是用于编译器和优化器。

const关键字是用于人类的,它的功能非常强大


有关const优化的更多信息,请参阅此部分。

我认为const的主要功能是编译时正确性检查,性能提高更像是一个令人愉快的副作用。

在您列出的示例中

Chunk::Chunk(string text, const COLOR * const background, 
                          const COLOR * const foreground);
您可能还应该通过
const&
传递字符串,除非您有意想要该字符串的本地副本。另外,在我看来,color参数应该声明为
const color*
,而不是
const color*const
。第二个
const
仅表示函数不会将
后台
前台
指针重新指向本地的其他内存块。它不会影响调用者,因此它是一个实现细节。因此,即使实现文件显式地将它们列为
const COLOR*const
,头中的原型也应为

Chunk::Chunk(string text, const COLOR *background, 
                          const COLOR *foreground);

也许你应该写
const string&text
,除非你需要一份副本。与我共事的大多数人对代码的成本正确性都非常严格。我不认为,这真的是一个技术问题,为什么有人写了一个糟糕的代码这两个
const
修饰符做了不同的事情;第一种方法限制函数修改对象,而第二种方法限制函数修改其正文中自己的参数。常量正确的代码编译起来不会比非常量正确的代码好/快很多。许多人无法编写常量正确的代码,因为他们是懒惰、邋遢、过于自信的代码猴子。也就是说,在没有实际帮助的地方使用“const”可能会走得太远,但事实并非如此。Const-correct代码使代码在记录意图时更易于维护。使用
Const
对性能没有多大好处。另见-1:这是一个常见的误解。指针或引用的“const”声明不能帮助优化器,因为这并没有说明被引用或指向的对象的常量(它是指针/引用的属性)。const指针/引用引用引用或指向的对象确实可以合法地变异(例如,由于别名),因此优化器不能对其进行特殊假设。gotw:81=>@Alessandro并且如果编译器正在进行全局优化,它不需要const关键字,因为它知道全局是否更改+1,在第二个
const
:标准规定,在函数声明中,参数类型的const从签名中删除(在本例中,参数类型为
COLOR const*
)。它在函数定义中是不同的,它告诉compi