我一直在为一些遗留的C++代码添加单元测试,并且我遇到了很多场景,其中函数内的断言在单元测试运行期间会被触发.我遇到的一个常见习语是带有指针参数的函数,如果参数为NULL则立即断言.
当我进行单元测试时,我可以通过禁用断言轻松解决这个问题.但我开始怀疑单元测试是否应该减轻对运行时断言的需求.这是正确的评估吗?单元测试是否应该通过在管道中更快地发生来替换运行时断言(即:错误是在失败的测试中捕获而不是在程序运行时).
另一方面,我不喜欢添加软代码失败(例如if (param == NULL) return false;).运行时断言至少可以在单元测试错过错误时更容易调试问题.
我正在编写一个C++程序,其中我有独立和依赖数据的向量,我想要适合三次函数.但是,我在生成可以适合我的数据的多项式时遇到了麻烦.
部分问题是我不能使用各种数字包,例如GSL(长篇故事); 对我的情况来说甚至可能有点矫枉过正.对于最小二乘拟合,我不需要非常通用的解决方案.我特别希望将我的数据拟合为三次函数.我可以访问索尼的矢量库,它支持4x4矩阵,可以计算它们的反转等.
在Scilab中进行原型设计时,我使用了以下函数:
function p = polyfit(x, y, n)
m = length(x);
aa = zeros(m, n+1)
aa(:,1) = ones(m,1)
for k = 2:n+1
aa(:,k) = x.^(k-1)
end
p = aa\y
endfunction
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不能很好地映射到我目前的环境.以上示例需要支持M x N + 1维的矩阵.就我而言,那是M x 4,其中M取决于我有多少样本数据.还有左分裂的问题.我需要一个支持任意维矩阵的逆矩阵库.
是否存在最小二乘算法,我可以避免计算aa\y,或者至少将其限制为4x4矩阵?我想我正在尝试将上述算法重写为一个更简单的情况,适用于拟合三次多项式.我不是在寻找代码解决方案,但如果有人能指出我正确的方向,我会很感激.
我通常不会花太多时间阅读汇编,所以下面的编译器输出让我感到困惑.
假设我在运行OSX 10.6的Intel Core 2 Duo上编译这段C代码:
while (var != 69) // var is a global variable
{
printf("Looping!\n");
}
Run Code Online (Sandbox Code Playgroud)
"var!= 69"比较的程序集如下所示:
cmpl $69, _var(%rip)
Run Code Online (Sandbox Code Playgroud)
我理解它有效地意味着将值"69"与全局变量"var"的内容进行比较,但我很难理解"_var(%rip)"部分.通常,我希望有一个偏移值,比如引用堆栈中的局部变量(例如:-4($ ebp)).但是,我并没有完全遵循如何使用"_var"声明来偏移指令指针将给出全局变量"var"的内容.
这条线究竟意味着什么?
谢谢.
我们一直希望在代码中使用无锁队列来减少当前实现中单个生产者和使用者之间的锁争用.那里有很多队列实现,但我还不太清楚如何最好地管理节点的内存管理.
例如,生产者看起来像这样:
queue.Add( new WorkUnit(...) );
Run Code Online (Sandbox Code Playgroud)
消费者看起来像:
WorkUnit* unit = queue.RemoveFront();
unit->Execute();
delete unit;
Run Code Online (Sandbox Code Playgroud)
我们目前使用内存池进行分配.您会注意到生产者分配内存并且消费者删除它.由于我们正在使用池,因此我们需要向内存池添加另一个锁以正确保护它.这似乎首先否定了无锁队列的性能优势.
到目前为止,我认为我们的选择是:
还有其他我们可以探索的选择吗?我们试图避免实现无锁内存池,但我们可能采取这种方式.
谢谢.
假设我有一个像这样的C++类:
class A
{
public:
A()
{
}
void SetNewB( const B& _b ) { m_B = _b; }
private:
B m_B;
}
Run Code Online (Sandbox Code Playgroud)
为了对这样的事情进行单元测试,我必须打破A对B的依赖.由于A类保持实际对象而不是指针,我将不得不重构此代码以获取指针.另外,我需要为B创建一个父接口类,这样我可以在测试SetNewB时传入我自己的假B.
在这种情况下,不依赖注入的单元测试是否会进一步使现有代码复杂化?如果我将B作为指针,我现在正在引入堆分配,现在有一段代码负责清理它(除非我使用ref计数指针).另外,如果B是一个相当简单的类,只有几个成员变量和函数,为什么要为它引入一个全新的接口,而不是仅使用B的实例进行测试?
我想你可以证明通过使用接口重构A会更容易.但是有些情况下两个类可能需要紧密耦合吗?
如果您在 VS2012 的 x64 项目中编译以下代码而没有任何 /Zp 标志:
#pragma pack(show)
Run Code Online (Sandbox Code Playgroud)
然后编译器会吐出:
value of pragma pack(show) == 16
Run Code Online (Sandbox Code Playgroud)
那么如果项目使用Win32的话,编译器会吐出:
value of pragma pack(show) == 8
Run Code Online (Sandbox Code Playgroud)
我不明白的是,Win64 中任何类型(即:long long 和指针)的最大自然对齐是 8。那么为什么不将 x64 的默认对齐设为 8?
与此有些相关,为什么有人会使用 /Zp16?
编辑:
这里有一个例子来说明我在说什么。即使对于 x64,指针具有 8 字节的自然对齐方式,Zp1 也可以强制它们达到 1 字节的边界。
struct A
{
char a;
char* b;
}
// Zp16
// Offset of a == 0
// Offset of b == 8
// Zp1
// Offset of a == 0
// Offset of b == 1
Run Code Online (Sandbox Code Playgroud)
现在,如果我们举一个使用 SSE 的例子: …
我对重载决策的理解是'T &&'通常比'const T&'更好地匹配.但是,我在这个简单的例子中看到编译器之间存在一些不一致的行为:
#include <iostream>
void Func(const double& a)
{
(void)a;
std::cout << "[lvalue]\n";
}
void Func(double&& a)
{
(void)a;
std::cout << "[rvalue]\n";
}
template <typename T>
void TFunc(T&& a)
{
Func(a);
}
int main ()
{
TFunc(5.5f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Clang 3.2将打印[rvalue].但是,VS2013 32位/ 64位编译器将打印[左值].如果我将'5.5f'更改为'5.5',则两个编译器都将打印[左值].
我可以理解为什么VS编译器会选择'const double&'版本,因为我没有std :: forward调用来保存参数的'&&'.但是,我仍然不明白是什么让clang认为'&&'超载是更好的选择.
为什么在double转换中添加隐式浮点会影响clang中的行为?谁是对的?
这有点人为,但我说我有这样的类接口:
class IResource;
class IResourceContainer
{
public:
virtual ~IResourceContainer() {}
virtual void AddResource(const std::string& rStrName,
std::auto_ptr<IResource> apResource)=0;
virtual IResource& GetResource(const std::string& rStrName)=0;
};
Run Code Online (Sandbox Code Playgroud)
我有一个这个类的实现,它包含一个IResource类型的字符串映射.如果我要像这样添加我自己的资源:
container.AddResource("foo", std:auto_ptr<IResource>( new CFooResource);
Run Code Online (Sandbox Code Playgroud)
然后检索资源引用
CFooResource& fooResource = container.GetResource(); // error
Run Code Online (Sandbox Code Playgroud)
这不会编译因为我需要将IResource转发到CFooResource.我想通过让GetResource获取一个模板参数来隐藏它,这个参数在内部向下转换类型,但很明显,模板和纯接口不会生成.我目前的替代方法是在CastResource函数中隐藏转换,该函数调用boost :: polymorphic_downcast,但我仍然不满意客户端需要转换资源的想法.
例如:
CFooResource& fooResource = CastResource<CFooResource&>(container.GetResource());
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是:是否有更好的方法来保存指向通用类型的指针,这些类型不需要用户进行明确的向下转换?我觉得有一种模板化的做法,但我没有看到它.此外,我创建了这个界面,以便客户可以在需要时轻松地在测试中模拟它.
谢谢.