小编NFR*_*RCR的帖子

std :: make_unique和std :: unique_ptr之间的差异与new

是否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)

c++ smart-pointers unique-ptr c++11 c++14

118
推荐指数
4
解决办法
5万
查看次数

int运算符!=和==比较为零

我发现!=和==不是测试零或非零的最快方法.

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上,指令是相同的(第一个版本看起来与第二个版本完全相同),但第二个版本仍然更快.

  1. 为什么编译器不能在x86-32上生成更快的版本?
  2. 当汇编输出相同时,为什么第二个版本在x86-64上仍然更快?

编辑:我添加了基准测试代码.ZERO:1544ms,1358ms NON_ZERO:1544ms,1358ms http://pastebin.com/m7ZSUrcPhttp://anonymouse.org/cgi-bin/anon-www.cgi/http://pastebin.com/m7ZSUrcP

注意:在单个源文件中编译时找到这些函数可能不方便,因为main.asm非常大.我在一个单独的源文件中有zero1,zero2,nonZero1,nonZero2.

编辑2:安装了VC++ 11和VC++ 2010的人是否可以运行基准测试代码并发布时间?它可能确实是VC++ 11中的一个错误.

c++ performance assembly machine-code

75
推荐指数
2
解决办法
3002
查看次数

C++连接__FILE__和__LINE__宏?

我希望我的异常消息包含有关异常位置的信息.

所以我想有一些类似的东西.

#define LOCATION __FILE__ " : " __LINE__

throw std::exception(std::string("ABCD. ") + LOCATION);
Run Code Online (Sandbox Code Playgroud)

这个定义显然是不正确的.怎么做到这一点?

c++

34
推荐指数
1
解决办法
1万
查看次数

为什么越界指针算术未定义的行为?

以下示例来自Wikipedia.

int arr[4] = {0, 1, 2, 3};
int* p = arr + 5;  // undefined behavior
Run Code Online (Sandbox Code Playgroud)

如果我从不取消引用p,那么为什么arr + 5单独的未定义行为?我希望指针表现为整数 - 除了取消引用时,指针的值被视为内存地址.

c++ undefined-behavior

27
推荐指数
4
解决办法
5401
查看次数

是否可以根据模板参数的常量有条件地启用模板类的非const/const数据成员?

是否可以根据模板参数的常量有条件地启用模板类的非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.

c++ templates c++11

10
推荐指数
2
解决办法
1924
查看次数

WinAPI Sleep()函数调用睡眠时间超过预期

操作系统: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毫秒.

c++ windows winapi

9
推荐指数
3
解决办法
1万
查看次数

删除nullptr - 性能开销?

如果指针为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,上面哪个执行得更快?

c++

8
推荐指数
1
解决办法
4962
查看次数

为可移动物体存储"有效性"状态是一种好习惯吗?

我正在设计一个库,许多类都是可移动的.许多可移动类作为参数传递给其他类的函数.我在考虑如何最小化验证检查的代码.在构造之后,可移动类的实例总是处于有效状态,但是在移动之后它们变为无效.

如果一个标志'有效'在构造之后是真的并且在移动之后变为假是一个好的做法.对象再次有效的唯一方法是将有效对象移入其中.

我还要提到,在移动对象之后,不要进入调用它们的函数会导致未定义的行为或任何东西的状态.移动后的内容就是垃圾.

c++

8
推荐指数
1
解决办法
131
查看次数

C++ - 非常奇怪的机器代码行为

完整的代码在这里: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.

c++ performance assembly machine-code

7
推荐指数
1
解决办法
287
查看次数

从模板类Base <A>派生类A,以便Base <A>可以使用A :: B?

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++

7
推荐指数
2
解决办法
131
查看次数