我无法弄清楚为什么在最后一种情况下启用了复制省略时调用的移动构造函数(甚至是强制性的,例如在C++ 17中):
class X {
public:
X(int i) { std::clog << "converting\n"; }
X(const X &) { std::clog << "copy\n"; }
X(X &&) { std::clog << "move\n"; }
};
template <typename T>
X make_X(T&& arg) {
return X(std::forward<T>(arg));
}
int main() {
auto x1 = make_X(1); // 1x converting ctor invoked
auto x2 = X(X(1)); // 1x converting ctor invoked
auto x3 = make_X(X(1)); // 1x converting and 1x move ctor invoked
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,哪些规则阻碍了移动构造函数被省略?
UPDATE
调用移动构造函数时可能更直接的情况: …
c++ language-lawyer move-semantics copy-elision perfect-forwarding
这句话说什么:
return static_cast<Hasher &>(*this)(key);
Run Code Online (Sandbox Code Playgroud)
?
我无法判断*thisor是否key被传递给static_cast. 我环顾四周,找到了这个答案,但与我所坚持的不同,第一对括号内没有任何内容。
有没有一种方法可以迭代(可能是巨大的)设置为true的位数std::bitset是线性的?我想防止必须检查bitset中的每个位置.迭代应该连续返回设置为true的每个位的索引.
为了更熟悉C++ 17,我刚才注意到std::visit:
template <class Visitor, class... Variants>
constexpr /*something*/ visit(Visitor&& vis, Variants&&... vars);
Run Code Online (Sandbox Code Playgroud)
为什么不std::visit采用单一变体,而是采用任意数量的变体?我的意思是,你总是可以采用一些标准的库函数,让它采用具有相同角色的多个参数,对所有这些参数进行处理(例如,std::find()对于容器中的多个元素); 或者你可以带多个访问者并在同一个变体上使用它们.
那么,为什么这个特定的"变化"?
我在这里介绍一些代码
__constant__ int array[1024];
__global__ void kernel1(int *d_dst) {
int tId = threadIdx.x + blockIdx.x * blockDim.x;
d_dst[tId] = array[tId];
}
__global__ void kernel2(int *d_dst, int *d_src) {
int tId = threadIdx.x + blockIdx.x * blockDim.x;
d_dst[tId] = d_src[tId];
}
int main(int argc, char **argv) {
int *d_array;
int *d_src;
cudaMalloc((void**)&d_array, sizeof(int) * 1024);
cudaMalloc((void**)&d_src, sizeof(int) * 1024);
int *test = new int[1024];
memset(test, 0, sizeof(int) * 1024);
for (int i = 0; i < 1024; i++) {
test[i] = …Run Code Online (Sandbox Code Playgroud) 存在几个对齐版本的古老malloc(),例如:
#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);
void *aligned_alloc(size_t alignment, size_t size);
#include <malloc.h>
void *memalign(size_t alignment, size_t size);
Run Code Online (Sandbox Code Playgroud)
(分别来自POSIX,glibc和Linux libc).但是 - 我似乎无法找到任何realloc()支持对齐的版本.它真的没有实现过吗?将非对齐的功能realloc()与在对齐的malloc()变体中搜索对齐的内存块相结合似乎是微不足道的.
有关:
C++ 11给了我们std::add_const; 使用C++ 17,我们有了一个新的结构 - std::as_const().前者只是const在你提供的类型之前添加了一个.第二个是函数的正确(模板),而不是类型特征,它似乎也是一样 - 除了类型是rvalue-reference时,在这种情况下它不能被使用.
我不太明白提供的动机std::as_const().为什么我们除此之外还需要它std::add_const?
在C ++ 20中,已经制作了许多(大多数?)C ++标准库算法constexpr。然而- std::accumulate还没有。
这似乎是它可能是:
template<class InputIt, class T>
constexpr T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first) {
init = std::move(init) + *first;
}
return init;
}
Run Code Online (Sandbox Code Playgroud)
所以-是否也没有理由constexpr吗?
在当今的大多数nVIDIA GPU上,共享内存的大小(OpenCL术语中的"本地内存")仅为16 KiB.
我有一个应用程序,我需要创建一个具有10,000个整数的数组.所以我需要适应10,000个整数的内存量= 10,000*4b = 40kb.