小编Dav*_*one的帖子

为什么我会使用push_back而不是emplace_back?

C++ 11向量具有新功能emplace_back.与push_back依赖于编译器优化以避免副本的情况不同,emplace_back使用完美转发将参数直接发送到构造函数以就地创建对象.在我看来,emplace_back一切都push_back可以做到,但有些时候它会做得更好(但从来没有更糟).

我有什么理由使用push_back

c++ std c++11

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

静态constexpr变量有意义吗?

如果我有一个函数(比方说,一个大阵列)内的变量,它是有意义的声明它既staticconstexprconstexpr保证数组是在编译时创建的,那么它会static没用吗?

void f() {
    static constexpr int x [] = {
        // a few thousand elements
    };
    // do something with the array
}
Run Code Online (Sandbox Code Playgroud)

static在生成的代码或语义方面,实际上是在做什么吗?

c++ static constexpr c++11

172
推荐指数
3
解决办法
7万
查看次数

为什么没有std :: stou?

C++ 11添加了一些新的字符串转换函数:

http://en.cppreference.com/w/cpp/string/basic_string/stoul

它包括stoi(string to int),stol(string to long),stoll(string to long long),stoul(string to unsigned long),stoull(string to unsigned long long).值得注意的是它是一个stou(字符串到无符号)函数.有什么理由不需要它,但所有其他的都是吗?

相关:C++ 11中没有"sto {short,unsigned short}"函数?

c++ string std c++11

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

为什么比vector.reserve(required)更快地调用vector.reserve(required + 1)?

我正在做一些测试,测量标准容器在各种条件下的性能,我遇到了一些奇怪的事情.当我将许多项目进入的中间std::vector,如果我首先调用储备与我会加入元素的确切数目,我看基本上是在大多数情况下没有性能上的差异与不调用储备,这是令人惊讶的对比.然而,更令人惊讶的是,如果我使用我需要的确切数量的元素来调用reserve + 1,那么我将获得显着的性能提升.这是我刚收到的结果示例表(所有时间都以秒为单位):

+---------------+--------+-------------------+-----------------------+
| # of elements | vector | vector (reserved) | vector (reserved + 1) |
+---------------+--------+-------------------+-----------------------+
|         10000 | 0.04   | 0.04              | 0.03                  |
|         20000 | 0.14   | 0.14              | 0.11                  |
|         30000 | 0.32   | 0.32              | 0.25                  |
|         40000 | 0.55   | 0.55              | 0.44                  |
|         50000 | 0.87   | 0.85              | 0.66                  |
|         60000 | 1.24   | 1.24              | 0.96                  |
|         70000 | …
Run Code Online (Sandbox Code Playgroud)

c++ memory performance stdvector

47
推荐指数
1
解决办法
1715
查看次数

constexpr重载

相关:函数返回constexpr无法编译

我觉得constexpr在C++ 11中的用处有限,因为无法定义两个本来具有相同签名的函数,但有一个是constexpr而另一个不是constexpr.换句话说,如果我有一个constexpr std :: string构造函数只接受constexpr参数,并且非constexpr std :: string构造函数用于非constexpr参数,那将非常有用.另一个例子是理论上复杂的功能,通过使用状态可以提高效率.使用constexpr函数你不能轻易做到这一点,所以你有两个选择:如果你传入非constexpr参数,那么constexpr函数非常慢,或者完全放弃constexpr(或写两个单独的函数,但你可能不知道要调用哪个版本).

因此,我的问题是:

是否有可能符合标准的C++ 11实现允许基于constexpr参数的函数重载,或者这需要更新标准?如果不允许,是否故意不允许?


@NicolBolas:假设我有一个映射enum到a 的函数std::string.最直接的方式做到这一点,假设我enum去从0n - 1,是创建一个大小的数组n充满了结果.

我可以创建一个static constexpr char const * []并构造一个std::string返回(std::string每次调用函数时支付创建对象的成本),或者我可以创建一个static std::string const []并返回我查找的值,std::string第一次支付所有构造函数的成本调用该函数.似乎更好的解决方案是std::string在编译时创建内存(类似于现在所做的char const *),但是执行此操作的唯一方法是警告构造函数它有constexpr参数.

对于一个除了std::string构造函数之外的例子,我认为找到一个例子是非常简单的,如果你可以忽略constexpr(并因此创建一个非constexpr函数)的要求,你可以创建一个更有效的函数.考虑一下这个帖子:constexpr问题,为什么这两个不同的程序用g ++在不同的时间内运行?

如果我fib用一个constexpr参数调用,我不能比编译器完全优化掉函数调用做得更好.但是,如果我fib使用非constexpr参数调用,我可能希望让它调用我自己的版本来实现memoization(这将需要状态)之类的东西,所以我得到的运行时间类似于我通过constexpr参数时的编译时间.

c++ overloading compile-time-constant constexpr c++11

45
推荐指数
5
解决办法
8601
查看次数

C++字符串文字的规则转义字符

\字符串文字中的转义字符有哪些规则?是否有所有转义字符的列表?

特别是,当我\在gedit中的字符串文字中使用并按任意三个数字跟随它时,它会以不同的方式对它们进行着色.

我试图std::string用文字创建一个构造,其中0后跟空字符(\0)后跟字符0.然而,语法突出显示警告我,这可能会创建类似于0后跟空字符(\00,aka \0)的字符,也就是说,只有两个字符.

对于这个问题的解决方案,这是最好的方法:

std::string ("0\0" "0", 3)  // String concatenation 
Run Code Online (Sandbox Code Playgroud)

并且是否存在一些关于转义字符在字符串文字中的作用的参考?例如,'\ a'是什么?

c++ string escaping

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

为什么"除以零"或任何其他例外未提出?

我有一个double[]LINQ操作正在执行:

MD = MD.Select(n => n * 100 / MD.Sum()).ToArray();
Run Code Online (Sandbox Code Playgroud)

在某些情况下,所有元素MD都是0然后Sum也是零.然后0 * 100 = 0 / 0,它没有给出除零例外或任何例外.为什么会这样?

.net c# linq ieee-754

28
推荐指数
2
解决办法
2774
查看次数

编译时constexpr错误,但在运行时没有开销

有一个众所周知的技巧,constexpr通过执行以下操作来在函数求值中导致编译时错误:

constexpr int f(int x) {
    return (x != 0) ? x : throw std::logic_error("Oh no!");
}
Run Code Online (Sandbox Code Playgroud)

如果在constexpr上下文中使用该函数,则会出现编译时错误x == 0.但是,如果参数f不是constexpr,那么它将在运行时抛出异常x == 0,但由于性能原因,这可能并不总是需要.

类似于assert被保护的理论NDEBUG,是否有一种方法可以导致constexpr函数的编译时错误,但是在运行时没有做任何事情?

最后,constexprC++ 1y(C++ 14)中的宽松规则会改变什么吗?

c++ constexpr c++11 c++14

25
推荐指数
1
解决办法
4695
查看次数

我应该使用从std :: random_device播种的随机引擎,还是每次都使用std :: random_device

我有一个包含两个随机源的类.

std::random_device rd;
std::mt19937 random_engine;
Run Code Online (Sandbox Code Playgroud)

std::mt19937打电话来播种std::random_device.如果我想生成一个数字并且我不关心重复性,我应该打电话rd()还是random_engine()

在我的特定情况下,我确信两者都可以正常工作,因为这将在某些网络代码中调用,其中性能不是很高,结果不是特别敏感.但是,我对何时使用硬件熵以及何时使用伪随机数的一些"经验法则"感兴趣.

目前,我只使用std::random_device我的std::mt19937引擎播种,以及我的程序需要的任何随机数代,我使用std::mt19937引擎.

编辑:以下是我正在使用此特定示例的解释:

这是一个游戏程序.该特定游戏允许用户在开始对抗对手之前定制他们的"团队".设置战斗的一部分涉及将团队发送到服务器.我的程序有几个团队,并使用随机数来确定要加载的团队.每次新的战斗都会调用std::random_device种子伪随机数生成器.我记录了战斗的初始状态,其中包括我随机选择的这个团队和初始种子.

我在这个问题中询问的特定随机数是随机团队选择(在没有让对手提前知道我正在使用哪个团队,但不是任务关键的情况下,这是有益的),但我是什么我真的在寻找是一个经验法则.它是精细始终使用std::random_device,如果我不需要我的号码的重复,或者是有使用起来比熵可以更快地采集的真正危险?

c++ random c++11

22
推荐指数
3
解决办法
2万
查看次数

继承自作为模板参数传递的const类型

以下代码无效:

struct base {
};

struct inherit : const base {
};
Run Code Online (Sandbox Code Playgroud)

您不能从const类型继承.

涉及模板时情况是否会发生变化?换句话说,这段代码是否有效:

struct base {
};

template<typename T>
struct inherit : T {
    using T::T;
};

int main() {
    inherit<base const>{};
}
Run Code Online (Sandbox Code Playgroud)

gcc说这很好,但clang报道

<source>:6:2: error: 'const base' is not a direct base of 'inherit<const base>', cannot inherit constructors

        using T::T;

        ^        ~

<source>:10:2: note: in instantiation of template class 'inherit<const base>' requested here

        inherit<base const>{};

        ^

1 error generated.

Compiler returned: 1
Run Code Online (Sandbox Code Playgroud)

为了让clang高兴,我需要做这样的事情:

template<typename T>
struct …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++11 c++14

22
推荐指数
1
解决办法
473
查看次数