小编j_h*_*j_h的帖子

为什么在C++ 11中允许通过const_iterator进行擦除?

从GCC 4.9.2开始,现在可以编译通过const_iterator插入或删除容器元素的C++ 11代码.

我可以看到插入接受const_iterator是多么有意义,但我很难理解为什么允许通过const_iterator进行擦除是有意义的.

此问题已在前面讨论过,但我没有看到行为改变背后的基本原理的解释.

我能想到的最好的答案是,改变的目的是使const_iterator的行为类似于const T*的行为.

显然允许使用const T*删除的一个主要原因是启用声明,例如:

const T* x = new T;
....
delete x;
Run Code Online (Sandbox Code Playgroud)

但是,它还允许以下不太理想的行为:

int** x = new int*[2];
x[0] = new int[2];
const int* y = x[0];
delete[] y; // deletes x[0] via a pointer-to-const
Run Code Online (Sandbox Code Playgroud)

而且我很难理解为什么const_iterator模仿这种行为是件好事.

c++ stl const delete-operator c++11

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

使用模板元编程的不同循环展开方法的优点/缺点

我对在编译时循环展开的一般解决方案感兴趣(我在SIMD设置中使用它,其中每个函数调用需要特定数量的时钟周期,并且多个调用可以并行执行,所以我需要调整数字使用累加器来减少浪费的周期 - 添加额外的累加器并手动展开会产生显着的改进,但是很费力).

理想情况下,我希望能够写出类似的东西

unroll<N>(f,args...); // with f a pre-defined function
unroll<N>([](...) { ... },args...); // using a lambda
Run Code Online (Sandbox Code Playgroud)

并生成以下内容:

f(1,args...);
f(2,args...);
...
f(N,args...);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有三个不同的模板元程序解决方案,我想知道不同方法的优点/缺点是什么,特别是关于编译器如何内联函数调用.

方法1(递归函数)

template <int N> struct _int{ };

template <int N, typename F, typename ...Args>
inline void unroll_f(_int<N>, F&& f, Args&&... args) {      
    unroll_f(_int<N-1>(),std::forward<F>(f),std::forward<Args>(args)...);
    f(N,args...);
}
template <typename F, typename ...Args>
inline void unroll_f(_int<1>, F&& f, Args&&... args) {
    f(1,args...);
}
Run Code Online (Sandbox Code Playgroud)

调用语法示例:

int x = 2;
auto mult = [](int n,int x) { std::cout << n*x …
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming loop-unrolling

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