是否std::make_unique
有像任何效率优势std::make_shared
?
与手动构建相比std::unique_ptr
:
std::make_unique<int>(1); // vs
std::unique_ptr<int>(new int(1));
Run Code Online (Sandbox Code Playgroud) 我发现!=和==不是测试零或非零的最快方法.
bool nonZero1 = integer != 0;
xor eax, eax
test ecx, ecx
setne al
bool nonZero2 = integer < 0 || integer > 0;
test ecx, ecx
setne al
bool zero1 = integer == 0;
xor eax, eax
test ecx, ecx
sete al
bool zero2 = !(integer < 0 || integer > 0);
test ecx, ecx
sete al
Run Code Online (Sandbox Code Playgroud)
编译器:VC++ 11优化标志:/ O2/GL/LTCG
这是x86-32的汇编输出.两个比较的第二个版本在x86-32和x86-64上都快了约12%.但是,在x86-64上,指令是相同的(第一个版本看起来与第二个版本完全相同),但第二个版本仍然更快.
编辑:我添加了基准测试代码.ZERO:1544ms,1358ms NON_ZERO:1544ms,1358ms http://pastebin.com/m7ZSUrcP 或 http://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP
注意:在单个源文件中编译时找到这些函数可能不方便,因为main.asm非常大.我在一个单独的源文件中有zero1,zero2,nonZero1,nonZero2.
编辑2:安装了VC++ 11和VC++ 2010的人是否可以运行基准测试代码并发布时间?它可能确实是VC++ 11中的一个错误.
我希望我的异常消息包含有关异常位置的信息.
所以我想有一些类似的东西.
#define LOCATION __FILE__ " : " __LINE__
throw std::exception(std::string("ABCD. ") + LOCATION);
Run Code Online (Sandbox Code Playgroud)
这个定义显然是不正确的.怎么做到这一点?
以下示例来自Wikipedia.
int arr[4] = {0, 1, 2, 3};
int* p = arr + 5; // undefined behavior
Run Code Online (Sandbox Code Playgroud)
如果我从不取消引用p,那么为什么arr + 5单独的未定义行为?我希望指针表现为整数 - 除了取消引用时,指针的值被视为内存地址.
是否可以根据模板参数的常量有条件地启用模板类的非const/const数据成员?或者可能有一些条件typedef?我想过将std :: enable_if与std :: is_const一起使用,但是我没有使用std :: is_not_const.
class A;
template <typename T>
class Test
{
A& m_a; // If T != const.
const A& m_a; // If T == const.
};
Run Code Online (Sandbox Code Playgroud)
请注意,总是T!= A.
操作系统:Windows 7
当将WinAPI Sleep()函数调用为Sleep(1)时,线程实际上会休眠15ms.我在循环中做了100次,总睡眠时间是1500毫秒而不是100毫秒.
这是常见的行为,还是我应该关注我的MOBO,CPU,Windows安装有什么问题?
编辑:如果可能的话,你可以运行这段代码并发布睡眠时间.我让我的一个朋友跑了这个,他实际上已经在1ms完成了所有这一切.
#include <iostream>
#include <ctime>
#include <Windows.h>
void test(void)
{
std::cout << "Testing 1ms sleep." << std::endl;
for (unsigned int i = 0; i < 10; i++)
{
std::clock_t startClocks = std::clock();
Sleep(1);
std::clock_t clocksTaken = std::clock() - startClocks;
std::cout << "Time: " << clocksTaken << "ms." << std::endl;
}
}
int main(void)
{
test();
std::cin.sync();
std::cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:似乎有些人获得1毫秒的原因是其他一些程序正在运行,将系统范围的计时器分辨率设置为1毫秒.默认情况下,Windows 7上的此值应为15.6毫秒.
如果指针为nullptr,则运算符delete将自行检查.在没有自己检查的情况下调用nullptr上的delete时是否有任何性能开销?
delete ptr;
Run Code Online (Sandbox Code Playgroud)
要么
if (ptr != nullptr) delete ptr;
Run Code Online (Sandbox Code Playgroud)
如果ptr是nullptr,上面哪个执行得更快?
我正在设计一个库,许多类都是可移动的.许多可移动类作为参数传递给其他类的函数.我在考虑如何最小化验证检查的代码.在构造之后,可移动类的实例总是处于有效状态,但是在移动之后它们变为无效.
如果一个标志'有效'在构造之后是真的并且在移动之后变为假是一个好的做法.对象再次有效的唯一方法是将有效对象移入其中.
我还要提到,在移动对象之后,不要进入调用它们的函数会导致未定义的行为或任何东西的状态.移动后的内容就是垃圾.
完整的代码在这里:http://pastebin.com/MM3vWmqA
在函数fast_generator中,我为两个语句添加了注释.如果切换这些语句,代码运行速度会快1.8倍.如果删除第一个语句,代码将比原始版本执行得更快,但与切换时相比更慢.
测试用例应如下.
第一 - 最慢.452ms.
counter++;
i--;
Run Code Online (Sandbox Code Playgroud)
第二 - 比第一个更快.280ms.
i--;
counter++;
Run Code Online (Sandbox Code Playgroud)
第三 - 比第一个快,但比第二个慢.421ms.
i--;
Run Code Online (Sandbox Code Playgroud)
原始语句的汇编器输出是.
inc edx
mov eax, 6
Run Code Online (Sandbox Code Playgroud)
我已经验证,当切换这些语句时,汇编程序输出保持不变,这些asm指令的唯一区别是互换.
我用VC++ 10和VC++ 11测试过它,行为相同.有人可以解释为什么切换这些语句会加速算法~1.8倍?如果您认为std :: clock()不准确,请更改size = 7.在我的机器上,size = 7的差异是12000ms vs 7000ms.
template <typename T>
class Base
{
private:
typename T::B c;
};
class A : public Base<A>
{
public:
class B;
};
Run Code Online (Sandbox Code Playgroud)
这样的事情甚至可能吗?VC++ 2013表示B不是A的成员.
c++ ×10
assembly ×2
c++11 ×2
machine-code ×2
performance ×2
c++14 ×1
templates ×1
unique-ptr ×1
winapi ×1
windows ×1