小编Inv*_*rse的帖子

从编译的可执行文件中获取编译器选项?

有没有办法看到在*nix中使用什么编译器和标志来创建可执行文件?我有一个旧版本的代码编译,我想看看是否编译有或没有优化.谷歌没有太大帮助,但我不确定我使用的是正确的关键词.

c c++ linux

48
推荐指数
4
解决办法
2万
查看次数

标准库容器在GCC中的rvalues上生成大量副本

我正在为linux和windows编写一个应用程序,并注意到GCC构建产生了许多对复制构造函数的无用调用.

以下是产生此行为的示例代码:

struct A
{
    A()                { std::cout << "default" << std::endl; }
    A(A&& rvalue)      { std::cout << "move"    << std::endl; }
    A(const A& lvalue) { std::cout << "copy"    << std::endl; }
    A& operator =(A a) { std::cout << "assign"  << std::endl; return *this; }
};

BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
    std::vector<A> vec_a( 3 );
}
Run Code Online (Sandbox Code Playgroud)

此测试仅创建3个元素的向量.我期望3个默认构造函数调用和0个副本,因为没有A左值.

在Visual C++ 2010中,输出为:

default
move
default
move
default
move
Run Code Online (Sandbox Code Playgroud)

在GCC 4.4.0(MinGW)中,( - 02 -std = c ++ 0x),输出为:

default
copy
copy
copy
Run Code Online (Sandbox Code Playgroud)

发生了什么,我该如何解决?副本对于实际类来说是昂贵的,默认构造和移动都很便宜.

c++ gcc mingw rvalue-reference c++11

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

如何在添加新的c ++ 0x rvalue引用运算符重载时减少冗余代码

我正在添加新的运算符重载以利用c ++ 0x rvalue引用,我觉得我正在生成大量冗余代码.

我有一个类,tree它在双值上包含一个代数运算树.这是一个示例用例:

tree x = 1.23;
tree y = 8.19;
tree z = (x + y)/67.31 - 3.15*y;
...
std::cout << z; // prints "(1.23 + 8.19)/67.31 - 3.15*8.19"
Run Code Online (Sandbox Code Playgroud)

对于每个二元运算(如加号),每一方可以是左值tree,右值treedouble.这导致每个二进制操作有8个重载:

// core rvalue overloads for plus:
tree operator +(const tree& a, const tree& b);
tree operator +(const tree& a, tree&&      b);
tree operator +(tree&&      a, const tree& b);
tree operator +(tree&&      a, tree&&      b);

// cast and forward cases: …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading rvalue-reference c++11

19
推荐指数
1
解决办法
1469
查看次数

lambda返回布尔

我想找到点,它具有较小的Y坐标(如果更多这样的点,找到具有最小X的那个).用lambda编写时:

    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        if (p1.first->y() < p2.first->y())
            return true;
        else if (p1.first->y() > p2.first->y())
            return false;
        else 
            return p1.first->x() < p2.first->x();
    }
Run Code Online (Sandbox Code Playgroud)

我正进入(状态:

error C3499: a lambda that has been specified to have a void return type cannot return a value
Run Code Online (Sandbox Code Playgroud)

有什么区别:

    // works
    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        return p1.first->y() < p2.first->y();
    }
Run Code Online (Sandbox Code Playgroud)

    // does not work
    std::min_element(begin, end, [](PointAndAngle& p1, PointAndAngle& p2) {
        if (p1.first->y() < p2.first->y())
            return true;
        else …
Run Code Online (Sandbox Code Playgroud)

c++ lambda visual-studio-2010

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

为什么SSE设置(_mm_set_ps)反转参数的顺序

我最近注意到了

_m128 m = _mm_set_ps(0,1,2,3);
Run Code Online (Sandbox Code Playgroud)

在转换为float数组时,将4个浮点数置于相反的顺序:

(float*) p = (float*)(&m);
// p[0] == 3
// p[1] == 2
// p[2] == 1
// p[3] == 0
Run Code Online (Sandbox Code Playgroud)

同样的情况union { _m128 m; float[4] a; }也发生了.

为什么SSE操作使用这种排序?这不是什么大问题,但有点令人困惑.

还有一个后续问题:

通过索引访问数组中的元素时,是应该按顺序访问0..3还是按顺序访问3..0

c c++ sse simd

15
推荐指数
3
解决办法
6233
查看次数

为什么主要没有定义`main(std :: vector <std :: string> args)`?

这个问题只是半眯着眼睛.我有时会梦想没有裸阵或c弦的世界.

如果您使用的是c ++,那么main的首选定义不应该是:

int main(std::vector<std::string> args)
Run Code Online (Sandbox Code Playgroud)

已经有多种定义main可供选择,为什么不存在符合C++精神的版本?

c++ coding-style idioms vector command-line-arguments

14
推荐指数
4
解决办法
3257
查看次数

优化循环的性能

我一直在描述我的代码(下面显示的函数)中的一个瓶颈,它被称为数百万次.我可以使用提示来提高性能.这些XXXs数字来自Sleepy.

使用visual studio 2013 /O2和其他典型版本设置进行编译.

indicies通常为0到20个值,其他参数大小相同(b.size() == indicies.size() == temps.size() == temps[k].size()).

1:          double Object::gradient(const size_t j, 
2:                                  const std::vector<double>& b, 
3:                                  const std::vector<size_t>& indices, 
4:                                  const std::vector<std::vector<double>>& temps) const
5:  23.27s  {
6:              double sum = 0;
7:  192.16s     for (size_t k : indices)
8:  32.05s          if (k != j)
9:  219.53s             sum += temps[k][j]*b[k];
10:      
11: 320.21s     return boost::math::isfinite(sum) ? sum : 0;
13: 22.86s  }
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

谢谢提醒伙计.以下是我从建议中得到的结果:

在此输入图像描述

我发现切换到cbegin() …

c++ performance c++11

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

如何确保在使用SSE内在函数时传播NaN?

我最近读到了关于NaNSSE算术运算中的值:

作用于两个而不是数字(NAN)参数的算术运算的结果是未定义的.因此,使用NAN参数的浮点运算将与相应汇编指令的预期行为不匹配.

资料来源:http://msdn.microsoft.com/en-us/library/x5c07e2a(v = vs.100).aspx

这是否意味着,添加两个__m128值可能会将a转换NaN为真实?

如果计算依赖于某个NaN值,我也需要最终结果NaN.有没有办法做到这一点?

c c++ floating-point sse nan

6
推荐指数
1
解决办法
1055
查看次数

如何使用boost lexical_cast库仅用于检查输入

我经常使用boost lexical_cast库将文本数据解析为数值。但是,在某些情况下,我只需要检查值是否为数字即可;我实际上不需要或不使用转换。

因此,我正在考虑编写一个简单的函数来测试字符串是否为双精度型:

template<typename T> 
bool is_double(const T& s)
{
  try 
  {
    boost::lexical_cast<double>(s); 
    return true;
  }
  catch (...) 
  {
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,由于我从未真正使用过该值,是否有任何优化的编译器会在此处放弃lexical_cast?

有没有更好的技术可以使用lexical_cast库执行输入检查?

c++ boost lexical-cast

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