小编ein*_*ica的帖子

为什么不使用`make_x()`函数尽可能省略移动构造函数?

我无法弄清楚为什么在最后一种情况下启用了复制省略时调用移动构造函数(甚至是强制性的,例如在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

21
推荐指数
2
解决办法
1250
查看次数

static_cast 后面跟着两对括号是什么意思?

这句话说什么:

return static_cast<Hasher &>(*this)(key);
Run Code Online (Sandbox Code Playgroud)

我无法判断*thisor是否key被传递给static_cast. 我环顾四周,找到了这个答案,但与我所坚持的不同,第一对括号内没有任何内容。

c++ function-object

21
推荐指数
2
解决办法
2210
查看次数

CUDA中有最大数量的流吗?

是否可以在CUDA中创建最大数量的流?

澄清我的意思是流中允许您执行内核和内存操作的CUDA流.

cuda

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

在std :: bitset中迭代真位的有效方法?

有没有一种方法可以迭代(可能是巨大的)设置为true的位数std::bitset线性的?我想防止必须检查bitset中的每个位置.迭代应该连续返回设置为true的每个位的索引.

c++ iteration algorithm bitset data-structures

20
推荐指数
2
解决办法
8698
查看次数

为什么std :: visit采用可变数量的变体?

为了更熟悉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()对于容器中的多个元素); 或者你可以带多个访问者并在同一个变体上使用它们.

那么,为什么这个特定的"变化"?

c++ std variant variadic-templates c++17

20
推荐指数
2
解决办法
1980
查看次数

CUDA恒定记忆最佳实践

我在这里介绍一些代码

__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)

cuda gpu-constant-memory

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

真的没有realloc()版本支持对齐吗?

存在几个对齐版本的古老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()变体中搜索对齐的内存块相结合似乎是微不足道的.

有关:

realloc是否保持posix_memalign的内存对齐?

c malloc memory-management alignment realloc

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

我们需要什么std :: as_const()?

C++ 11给了我们std::add_const; 使用C++ 17,我们有了一个新的结构 - std::as_const().前者只是const在你提供的类型之前添加了一个.第二个是函数的正确(模板),而不是类型特征,它似乎也是一样 - 除了类型是rvalue-reference时,在这种情况下它不能被使用.

我不太明白提供的动机std::as_const().为什么我们除此之外还需要它std::add_const

c++ const rationale type-traits c++17

19
推荐指数
2
解决办法
1346
查看次数

为什么C ++ 20中没有将std :: accumulate设为constexpr?

在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吗?

注意:这个问题是由动机我的回答这个问题的编译时间的积累。

c++ c++-standard-library accumulate c++20

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

GPU共享内存的大小非常小 - 我该怎么办呢?

在当今的大多数nVIDIA GPU上,共享内存的大小(OpenCL术语中的"本地内存")仅为16 KiB.
我有一个应用程序,我需要创建一个具有10,000个整数的数组.所以我需要适应10,000个整数的内存量= 10,000*4b = 40kb.

  • 我该如何解决这个问题?
  • 有没有超过16 KiB共享内存的GPU?

gpu nvidia gpu-shared-memory

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