我正在通过“Accelerated C ++”工作,我将我的答案与章节结束练习与找到的here进行比较。在为行和列填充创建用户输入时,我写道:
int colpad;
cout << "Please enter the number of columns to pad: ";
cin >> colpad;
int rowpad;
cout << "Please enter the number of rows to pad: ";
cin >> rowpad;
然后在整个函数的其余部分继续使用rowpad和colpad。这对我有用。
然而,上述网站解决方案的作者完成了我的工作,然后添加了(为了清晰起见,变量名称已更改):
const int rowpad = inrowpad; // vertical padding
const int colpad = incolpad; // horizontal padding
他的解决方案也有效。我的问题是:我应该第二次存储colpad和rowpad的值作为const吗?这不只是占用额外的记忆吗?
答案 0 :(得分:3)
将值存储到const
版本中是不必要的。使用const
对象可防止意外更改,如果编译器可以确定用于初始化const
对象的变量不会发生变化,则可能无法使用额外内存。
if (!(std::cin >> colpad)) {
// deal with the read failure
}
答案 1 :(得分:2)
额外的内存将无关紧要,编译器可能无论如何都会优化它,但使用const
可以减少错误的几率。
我想知道在同一范围内为同一件事件增加两个变量的复杂性是否值得。
我更愿意将非const变量提取到一个单独的函数中:
int getInt() {
int in;
if(cin >> in)
return in;
... // handle errors
}
cout << "Please enter the number of columns to pad: ";
const int colpad = getInt();
cout << "Please enter the number of rows to pad: ";
const int rowpad = getInt();
然后主范围中只有一个变量,它还有一个额外的好处,即代码重复会减少一点。
答案 2 :(得分:1)
使用const是一种保护输入值不被以后更改的好方法。鉴于您提供的网站上的示例程序没有理由添加新的const变量,是的,它会在执行期间消耗几个额外字节的代码空间和内存。
如果以后想要将变量或指针传递给其他函数,可以考虑使用const来保护指针和引用。但是,做示例所显示的内容并没有什么害处,你的问题是正确的。
还要直接回答你的主题:没有必要。
答案 3 :(得分:1)
这些结构通常会被优化掉#34;在编译期间。这意味着,在您的二进制程序中,通常只有变量的单个副本。
因此,只要您不制作非恒定空间复杂度(数组,树,图......)结构的不必要副本,您就不必担心一个或两个额外变量。
答案 4 :(得分:1)
我可能会定义一个函数而不是2个变量:
int getIntFromUserInput()
{
int inputValue(0);
std::cin >> inputValue;
return inputValue;
}
可以使用如下:
std::cout << "Please enter the number of columns to pad: ";
const int numColumnsToPad(getIntFromUserInput());
std::cout << "Please enter the number of rows to pad: ";
std::const int numRowsToPad(getIntFromUserInput());
这样,您可以将输入结果存储为const,而不必担心不需要的内存使用情况。