我已经告诉别人,编写using namespace std;代码是错误的,我应该用std::cout和std::cin直接代替.
为什么被using namespace std;认为是不好的做法?是低效还是冒着声明模糊变量(与名称std空间中的函数具有相同名称的变量)的风险?它会影响性能吗?
我正在编写一些模板化代码来使用浮点数和双精度数据算法进行基准测试,以便与GPU实现进行比较.
我发现我的浮点代码速度较慢,在调查使用英特尔的Vtune放大器后,我发现g ++正在生成额外的x86指令(cvtps2pd/cvtpd2ps和unpcklps/unpcklpd),将一些中间结果从float转换为double然后再转回.此应用程序的性能下降几乎为10%.
在使用标志-Wdouble-promotion(其中BTW未包含在-Wall或-Wextra中)进行编译之后,确定g ++警告我结果正在被提升.
我将其简化为如下所示的简单测试用例.请注意,c ++代码的顺序会影响生成的代码.复合语句(T d1 = log(r)/ r;)产生警告,而分离的版本不产生(T d = log(r); d/= r;).
以下用g ++ - 4.6.3-1ubuntu5和g ++ - 4.7.3-2ubuntu1~12.04编译,结果相同.
编译标志是:
g ++ - 4.7 -O2 -Wouble-promotion -Wextra -Wall -pedantic -Werror -std = c ++ 0x test.cpp -o test
#include <cstdlib>
#include <iostream>
#include <cmath>
template <typename T>
T f()
{
T r = static_cast<T>(0.001);
// Gives no double promotion warning
T d = log(r);
d/=r;
// Promotes to double
T d1 = log(r)/r;
return d+d1;
} …Run Code Online (Sandbox Code Playgroud) 我正在学校上课,我想开始在课堂上做一些c ++编程.我的学校使用Microsoft Visual C++ 6.0(从1998年开始),所以它仍然使用<iostream.h>而不是<iostream>和using namespace std.当我开始工作时,我无法弄清楚如何以及何时使用using namespace std以及何时只使用std::cout<<"Hello World!"<<'\n';(例如)以及它的限制和命名空间关键字的其他用途.特别是,如果我想用iostream和iomanip创建一个程序,我是否必须两次声明"使用命名空间std",或者是否有一些我必须使用的东西,或者我可以做同样的事情我和iostream一起做过吗?我试过谷歌搜索它,但我真的不明白.在此先感谢您的帮助.
c++ ×3
namespaces ×2
std ×2
c++-faq ×1
g++ ×1
header ×1
intel-vtune ×1
templates ×1
visual-c++ ×1