在使用cin时,是否有必要将一个变量存储两次
Is it necessary to store a variable twice when using cin?
我正在学习"加速C++",并将我对章末练习的回答与此处的答案进行了比较。在创建行和列填充的用户输入时,我写道:
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
版本中。使用const
对象可以防止意外更改,并且在函数中,如果编译器能够确定用于初始化const
对象的变量不更改,则可能不会使用额外的内存。
顺便说一句,代码在另一方面是错误的:您应该始终在读取后验证读取操作是否成功:
if (!(std::cin >> colpad)) {
// deal with the read failure
}
额外的内存将是微不足道的,编译器无论如何都可以对其进行优化,但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();
然后主作用域中只有一个变量,它还有一个额外的好处,即代码重复减少了一点。
使用const是保护输入值不受以后更改影响的好方法。考虑到您提供的网站上的示例程序,没有理由添加新的常量变量,而且在执行过程中会额外消耗几个字节的代码空间和内存。
如果以后要将变量或指针传递给其他函数,可以考虑使用const来保护指针和引用。但是,做这个例子并没有害处,你的问题是正确的。
还要直接回答你的主题:不,没有必要。
这样的构造通常在编译过程中被"优化掉"。这意味着,在二进制程序中,通常会有一个变量的副本。
因此,只要你没有对非恒定空间复杂性的结构(数组、树、图…(进行不必要的复制,你就不应该担心一两个额外的变量。
我可以定义一个函数,而不是两个变量:
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,而不必担心不必要的内存使用。
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- Boost program_options将多个配置文件解析结果存储到一个parsed_options中
- 将一个类的方法指针存储到另一个类中
- C++在一个映射中存储不同的指针类型(并处理销毁)
- 存储另一个函数返回的布尔数组时遇到问题
- 初始化一个由 p 指向的新 INTSTK,它最多可以存储 m 个
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 将一个阵列中的数据存储到另外两个阵列中不起作用
- 一个 2D 数组,并按行存储值.第一个循环用于行索引,第二个循环用于列索引
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 生成一个类Name_class并将两种数据类型存储在一个向量中
- C 创建一个存储不同类型的向量
- 使用带有boost::program_options的多个源时,请使用最后一个存储值,而不是第一个存储值
- 创建一个伪元组,一个存储在其他地方的数据的前端
- 想要在C++中创建一个存储Nx3值的2D指针
- 一个存储大量元素的容器
- 为什么一个懒惰加载的QWidget会显示,而一个存储的却不会
- 我应该在什么时候为我的项目创建一个存储库
- 如何创建一个存储任意类型向量的向量