小编use*_*436的帖子

为什么 std::next/prev 不像 std::advance 那样按距离模板化?

出于好奇,对 的std::advance()距离类型使用模板参数的基本原理是什么,但difference_type对距离 instd::next()和使用迭代器的基本原理是什么std::prev()

为什么不使用相同的方法(任一方法)?

跟进:

默认的存在n = 1似乎并没有阻止next被模板化,Distance正如下面答案中所建议的那样。这编译:

#include <iterator>
#include <set>

template<typename InputIt,
    typename Distance = typename std::iterator_traits<InputIt>::difference_type>
InputIt my_next(InputIt it, Distance n = 1)
{
    std::advance(it, n);
    return it;
}

int main()
{
    std::set<int> s;
    my_next(s.begin());
    my_next(s.begin(), 10ul);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ iterator c++11

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

C++ 98/03引用折叠和cv限定符

下面的代码编译(gcc 4.7.2或icc 13)并产生"1 2"输出.这意味着const限定符被删除,即f<int&>具有参数类型int&.

为什么会这样?据我了解,根据§14.3.1.4:

如果一个模板参数的模板参数T名称的类型"参考CV1 S ",企图制造型"参考CV2 T "创造型"参考CV12 S ",其中CV12是CV-合格网络ERS的联合CV1cv2.冗余的cv-quali firs被忽略.

const不应该被丢弃.这是代码:

#include <iostream>
using namespace std;

template <typename T>
void f(const T& t)
{
    t++;
}

int main()
{
    int a = 1;

    cout << a;
    f<int&>(a);
    cout << ' ' << a << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ reference qualifiers c++03 c++98

6
推荐指数
2
解决办法
531
查看次数

MPI是否提供预处理器宏?

MPI标准是否提供预处理器宏,因此如果由启用MPI的编译器编译,我的C/C++代码可以分支?像_OPENMPOpenMP的宏.

c c++ mpi

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

模板化的 constexpr 变量

我想确认这段代码是合法的(或不合法的?)C++17。

#include <iostream>

template<int N> inline constexpr float MyConst;

template<> inline constexpr float MyConst<1> = 1.1f;
template<> inline constexpr float MyConst<2> = 2.2f;

int main ()
{
    std::cout << MyConst<1> << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果由g++MSVC编译,我不会得到错误(并得到正确的输出),

但是Intelclang给出了一个错误:

test.cpp(3): error: missing initializer for constexpr variable
  template<int N> inline constexpr float MyConst;
                         ^
Run Code Online (Sandbox Code Playgroud)

-std=c++17(/std:c++17对于 MSVC)编译。

在 Godbolt 和我的本地机器上尝试了最新的编译器。

c++ templates constexpr c++17

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

将 std::minmax 结果分配给新变量

auto [x, y] = std::minmax(a, b)xand定义y为对aand b(或band a)的引用。

如何分别使用最小值xy最大值初始化新变量(就好像minmax返回值对而不是引用对)?

c++

5
推荐指数
1
解决办法
94
查看次数

模板化函数专精:链接器错误

当模板参数类型相同时,我试图专门化两个模板参数的功能.我这样做的方式如下:

#include <iostream>
#include <type_traits>

using namespace std;

template<typename U, typename T>
int fun( U& u, T t );

template<>
inline
int fun( int& u, float t )
{
    cout << "int, float" << endl;
    return 0;
}

template<typename U, typename T>
inline
int fun( U& u, typename std::enable_if<std::is_same<U, T>::value ,T>::type t )
{
    cout << "U == T" << endl;
    return 0;
}

int main()
{
    int a;
    float b1, b2;

    fun(a, b1);
    fun(b1, b2);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译得很好(GCC …

c++ linker templates specialization c++11

4
推荐指数
1
解决办法
237
查看次数

Intel 的 pragma simd 与 OpenMP 的 pragma omp simd

英特尔编译器允许我们通过以下方式对循环进行矢量化

#pragma simd
for ( ... )
Run Code Online (Sandbox Code Playgroud)

但是,您也可以选择使用 OpenMP 4 的指令执行此操作:

#pragma omp simd
for ( ... )
Run Code Online (Sandbox Code Playgroud)

两者之间有什么区别吗?

simd vectorization openmp

4
推荐指数
1
解决办法
3445
查看次数

SSE/AVX:根据每个元素的最小和最大绝对值从两个__m256浮点向量中选择

我正在寻找高效的AVX(AVX512)实现

// Given
float u[8];
float v[8];

// Compute
float a[8];
float b[8];

//  Such that
for ( int i = 0; i < 8; ++i )
{
    a[i] = fabs(u[i]) >= fabs(v[i]) ? u[i] : v[i];
    b[i] = fabs(u[i]) <  fabs(v[i]) ? u[i] : v[i];
}
Run Code Online (Sandbox Code Playgroud)

也就是说,我需要选择逐个元素为auv基础mask,并为b基于!mask,在mask = (fabs(u) >= fabs(v))逐元素.

sse intrinsics avx avx512

4
推荐指数
1
解决办法
436
查看次数

有符号或无符号循环计数器

在这个简单的示例中,我对使用有符号循环计数器和无符号循环计数器之间的差异感到非常惊讶:

double const* a;
__assume_aligned(a, 64);
double s = 0.0;

//for ( unsigned int i = 0; i < 1024*1024; i++ )
for ( int i = 0; i < 1024*1024; i++ )
{
    s += a[i];
}
Run Code Online (Sandbox Code Playgroud)

在签名的情况下,生成了 icc 19.0.0(我显示了循环的展开部分):

..B1.2:
    vaddpd    zmm7, zmm7, ZMMWORD PTR [rdi+rax*8]
    vaddpd    zmm6, zmm6, ZMMWORD PTR [64+rdi+rax*8]
    vaddpd    zmm5, zmm5, ZMMWORD PTR [128+rdi+rax*8]
    vaddpd    zmm4, zmm4, ZMMWORD PTR [192+rdi+rax*8]
    vaddpd    zmm3, zmm3, ZMMWORD PTR [256+rdi+rax*8]
    vaddpd    zmm2, zmm2, ZMMWORD PTR [320+rdi+rax*8]
    vaddpd    zmm1, …
Run Code Online (Sandbox Code Playgroud)

optimization assembly icc compiler-optimization unsigned-integer

4
推荐指数
1
解决办法
1184
查看次数

-march = native归结为什么?

当前,我们在同一硬件上编译和运行代码,因此使用-march=nativeflag。

我们将继续在此硬件上运行,但在不同的体系结构上进行编译。因此,我需要替换native为等效于当前硬件的任何东西。

有没有办法gcc报告native特定硬件上的等效值?

gcc compiler-options

4
推荐指数
1
解决办法
71
查看次数