C++ C+;中内置类型的常量修饰符开销+;

C++ C+;中内置类型的常量修饰符开销+;,c++,constants,overhead,C++,Constants,Overhead,我更喜欢将const修饰符添加到我编写的函数中的所有内置参数中。例如: void foo(const int arg1, const double arg2); 对我来说比: void foo(int arg1, double arg2); 在代码检查之后,我被告知const修饰符在应用于整数和内置类型时会带来开销。这是真的吗?为什么 谢谢,这不是真的 或者,更准确地说,我想不出一个理由来说明这是真的。const所做的一切就是强制编译器检查您没有更改变量的值;但这是编译时检查 1.假设我们

我更喜欢将
const
修饰符添加到我编写的函数中的所有内置参数中。例如:

void foo(const int arg1, const double arg2);
对我来说比:

void foo(int arg1, double arg2);
在代码检查之后,我被告知
const
修饰符在应用于整数和内置类型时会带来开销。这是真的吗?为什么

谢谢,这不是真的

或者,更准确地说,我想不出一个理由来说明这是真的。const所做的一切就是强制编译器检查您没有更改变量的值;但这是编译时检查


1.假设我们使用与运行时性能或编译代码大小相关的“开销”的传统定义

在代码审查之后,我被告知constmodifier在应用于integer和内置类型时会带来开销。这是真的吗?为什么

你给了谁你的代码来检查它?初级程序员

上述情况并非如此。恰恰相反。使用常量可能会应用一些优化。

不,那不是真的


我想你/他们把const和通过引用传递混淆了。

const没有开销,我想你的同事只是对它的用法感到困惑,因为它(不幸的是)不太常见。就个人而言,我更喜欢
const
尽可能多的局部变量,因为它增加了可读性

当然,反驳总是很容易的,采用以下程序并使用汇编输出进行编译:

#include <stdio.h>

void foo1(int a, double b)
{
  printf("Not const %d, %g\n", a, b);
}

void foo2(const int a, const double b)
{
  printf("Const %d, %g\n", a, b);
}


int main()
{
  for(int i = 0; i < 10; ++i)
  {
    foo1(i, 5.5 * i);
    foo2(i, 12.8 * i);
  }
  return 0;
}
对于
foo2
(带有
const
-说明符):

事实并非如此

与此无关,您不应该将
const
放入函数声明中,因为它是一个实现细节:它只限定函数范围中的局部变量。所以你可以这样写:

double foo(unsigned int a, double b);  // declaration

double foo(unsigned int const a, double b)  // implementation
{
    b *= a;
    return bar(b);   // silly example
}

你指的是什么类型的间接费用?
编译二进制文件的开销还是编译器的开销?我确信,对于您添加的第一个和第二个代码示例,编译后的二进制代码是相同的。对于编译器-也许。Const添加了额外的条件,这些条件必须在编译时检查。

如果它强制您创建额外的局部变量,则可能会带来开销

无常数

void foo(const int arg1, double arg2)
{
    if (arg1 == 1)
        arg2 += 5.0;

    // use arg2
}
有常数

void foo(const int arg1, const double arg2)
{
    double arg2Copy;
    if (arg1 == 1)
        arg2Copy = arg2 + 5.0;
    else
        arg2Copy = arg2;

    // use arg2Copy
}

但这实际上取决于编译器。如果您担心开销,应该比较生成的代码。

它的开销不比
typedef
多。你的同事错了

如果你想说服他,打印出两种变体的分解,并向你的同事展示它们是一样的



然而,像这样将
const
限定符添加到基元类型是毫无意义和徒劳的。不管怎样,它们都是复制的,修改它们没有坏处。让它们保持不变没有什么好处。

这会带来5个字符的开销,
c
o
n
s
t
,我猜。是时候更新你的简历,找一份可以和有俱乐部的人一起工作了。这是一个可怕的6!还有一个space@DavidHeffernan:那么为什么要在那里设置hvae常量限定符?不管我们以何种方式传递值,如果函数愿意,就让它修改该值。@JamesKanze:重构那些有点太复杂的函数时,我要做的第一件事是
const
尽可能多的局部变量,然后我可以把它们(变量)从我的脑海中抹去。并不是所有你在野外接触到的代码都是你喜欢的。他没有说明他指的是哪种“开销”。我能想到程序速度、程序大小、编译速度或代码可读性。@UweKeim:没错。但在进一步限定之前,我将假设运行时开销(尽管我现在在回答中已经明确了这一点,谢谢!)。事实上,由于他的参数成为常量对象,编译器很可能会使用
const
进行更多优化。(在实践中,我希望在激活优化的情况下,大多数编译器都会检测到对象没有被修改,不管是否有常量。)@JamesKanze:这将启用哪个优化?@jalf编译器知道
const
对象在初始化后不会改变值。实际上,大多数编译器都会意识到这一点,但如果您通过引用或通过指向另一个函数的指针传递参数,编译器不能确定该函数不会抛出const并修改该值,除非对象本身是const。任何明智的编译器都应该优化这些是相同的。为什么你认为这是“开销”?声明额外变量不会影响生成的代码系统使用
const
会增加文件大小。对于非常简单的语言和没有优化的情况,读取文件的时间可能是编译时间的重要部分,甚至是主要部分。但是C++没有资格作为一种“非常简单的语言”,即使没有优化,像模板类型演绎之类的东西也要比简单地读取文件所花费的时间要多。这可能会导致混淆,因为声明和定义在视觉上是不同的。出于这个原因,我在这里不使用const,但我肯定能理解他的立场;
const
的优点是否超过了由于外观不同而可能造成的混淆,这实际上是一个非常主观的判断调用。这并不一定毫无意义(假设我们谈论的是函数定义而不是原型)。为什么不呢?它可以防止哪些错误?制作一个
int
const的副本可以得到什么?与制作任何其他局部变量
const
(保护您免受自己、文档意图等的影响)一样。我不太明白如何做。其目的是创建
int
的副本。调用者的意图中没有任何内容禁止或阻止被调用者修改该副本。甚至可能是你
void foo(const int arg1, double arg2)
{
    if (arg1 == 1)
        arg2 += 5.0;

    // use arg2
}
void foo(const int arg1, const double arg2)
{
    double arg2Copy;
    if (arg1 == 1)
        arg2Copy = arg2 + 5.0;
    else
        arg2Copy = arg2;

    // use arg2Copy
}