出于好奇,对 的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) 下面的代码编译(gcc 4.7.2或icc 13)并产生"1 2"输出.这意味着const限定符被删除,即f<int&>具有参数类型int&.
为什么会这样?据我了解,根据§14.3.1.4:
如果一个模板参数的模板参数
T名称的类型"参考CV1S",企图制造型"参考CV2T"创造型"参考CV12S",其中CV12是CV-合格网络ERS的联合CV1和cv2.冗余的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) MPI标准是否提供预处理器宏,因此如果由启用MPI的编译器编译,我的C/C++代码可以分支?像_OPENMPOpenMP的宏.
我想确认这段代码是合法的(或不合法的?)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编译,我不会得到错误(并得到正确的输出),
但是Intel和clang给出了一个错误:
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 和我的本地机器上尝试了最新的编译器。
auto [x, y] = std::minmax(a, b)将xand定义y为对aand b(或band a)的引用。
如何分别使用最小值x和y最大值初始化新变量(就好像minmax返回值对而不是引用对)?
当模板参数类型相同时,我试图专门化两个模板参数的功能.我这样做的方式如下:
#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 …
英特尔编译器允许我们通过以下方式对循环进行矢量化
#pragma simd
for ( ... )
Run Code Online (Sandbox Code Playgroud)
但是,您也可以选择使用 OpenMP 4 的指令执行此操作:
#pragma omp simd
for ( ... )
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别吗?
我正在寻找高效的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)
也就是说,我需要选择逐个元素为a从u和v基础mask,并为b基于!mask,在mask = (fabs(u) >= fabs(v))逐元素.
在这个简单的示例中,我对使用有符号循环计数器和无符号循环计数器之间的差异感到非常惊讶:
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
当前,我们在同一硬件上编译和运行代码,因此使用-march=nativeflag。
我们将继续在此硬件上运行,但在不同的体系结构上进行编译。因此,我需要替换native为等效于当前硬件的任何东西。
有没有办法gcc报告native特定硬件上的等效值?