我希望有可能为我的程序的调试目的增加详细程度.当然,我可以在运行时使用开关/标志来做到这一点.但由于我应该在代码中添加所有"if"语句,因此效率非常低.
所以,我想在编译期间添加一个标志,以便在我的代码中包含可选的,通常很慢的调试操作,而不会在不需要时影响程序的性能/大小.这是一个例子:
/* code */
#ifdef _DEBUG_
/* do debug operations here
#endif
Run Code Online (Sandbox Code Playgroud)
因此,使用-D_DEBUG_进行编译应该可以解决问题.没有它,那部分将不会包含在我的程序中.
另一种选择(至少对于i/o操作)将至少定义一个i/o函数,如
#ifdef _DEBUG_
#define LOG(x) std::clog << x << std::endl;
#else
#define LOG(x)
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我强烈怀疑这可能不是最干净的方法.那么,你会做什么呢?
我的代码需要从以下函数连续计算一个值:
inline double f (double x) {
return ( tanh( 3*(5-x) ) *0.5 + 0.5);
}
Run Code Online (Sandbox Code Playgroud)
分析表明程序的这一部分是花费大部分时间的地方。由于该程序将运行数周甚至数月,我想优化此操作并正在考虑使用查找表。
我知道查找表的效率取决于表本身的大小以及它的设计方式。目前我不能使用少于 100 MB,最多可以使用 2GB。矩阵中两点之间的值将被线性插值。
使用查找表会比进行计算更快吗?此外,使用 N 维矩阵是否会比一维 std::vector 更好,并且不应跨越的表大小的阈值(如果有)是多少?
我有一个以(公共)函数为特色的类返回一个向量(但它似乎无关紧要).
std::vector<int> test() {
return std::vector<int>(1,0);
}
Run Code Online (Sandbox Code Playgroud)
为什么我被允许称它为虚函数,
test();
Run Code Online (Sandbox Code Playgroud)
没有得到编译错误,或者至少有警告(Wall,pedantic)?
我写了一个小的3d矢量类.特别是我写了两个函数,一个用于旋转向量,另一个用于返回向量本身的旋转副本.所以我有以下内容:
Vector Vector::Rotate(const double angle, Vector& axis) const {
Vector b=*this;
b.Rotate(angle,axis);
return (b);
}
void Vector::Rotate(const double angle, Vector & axis) {
/* let's promote this vector to a quaternion */
Quaternion V (0,*this);
/* quaternion describing the rotation */
Quaternion q (cos(angle/2),axis*sin(angle/2));
/* actual rotation */
*this = (q*V*q.conjugate()).Vec();
}
Run Code Online (Sandbox Code Playgroud)
现在,当我写这样的东西时:
vector2 = vector1.Rotate(rbo::M_PUCKER,i);
Run Code Online (Sandbox Code Playgroud)
我得到错误:没有运算符"="匹配这些操作数操作数类型是:Vector = void
我希望编译器能够理解我想要的东西:他为什么选择void版本而不是另一个返回向量?而且,按照我的方式编写更多相同功能的版本是一种很好的做法吗?
c++ ×4
caching ×1
debugging ×1
macros ×1
optimization ×1
overloading ×1
performance ×1
return-value ×1