小编tml*_*len的帖子

Struct是非文字类型

struct rgb_color {
    constexpr rgb_color(std::uint8_t nr, std::uint8_t ng, std::uint8_t nb) :
        r(nr), g(ng), b(nb) { }

    std::uint8_t r; // red
    std::uint8_t g; // green
    std::uint8_t b; // blue

    constexpr static rgb_color black = rgb_color(0, 0, 0);
    constexpr static rgb_color white = rgb_color(255, 255, 255);
};
Run Code Online (Sandbox Code Playgroud)

constexpr static常量定义无法编译:

constexpr variable cannot have non-literal type 'const rgb_color'
Run Code Online (Sandbox Code Playgroud)

但是根据http://en.cppreference.com/w/cpp/concept/LiteralType,const rgb_color应该是文字类型,因为它只有文字类型作为数据成员(std::uint8_t)和constexpr构造函数.

为什么代码不能编译?

此外,是否有必要constexpr static.cc文件中定义成员,如

constexpr rgb_color rgb_color::black;
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

7
推荐指数
2
解决办法
2510
查看次数

使用SFINAE禁用模板类成员函数

是否可以使用SFINAE并std::enable_if禁用模板类的单个成员函数?


我目前有一个类似于此的代码:

#include <type_traits>
#include <iostream>
#include <cassert>
#include <string>

class Base {
public:
    virtual int f() { return 0; }
};

template<typename T>
class Derived : public Base {
private:
    T getValue_() { return T(); }

public:
    int f() override {
        assert((std::is_same<T, int>::value));
        T val = getValue_();
        //return val; --> not possible if T not convertible to int
        return *reinterpret_cast<int*>(&val);
    }
};


template<typename T>
class MoreDerived : public Derived<T> {
public:
    int f() override { return 2; …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae c++14

7
推荐指数
2
解决办法
620
查看次数

朋友功能的使用声明

在C++ 11中,可以通过声明使外部(公共)可以访问私有基类的公共成员using.例如

class A {
private:
    int i = 2;
public:
    void f() { i = 3; }

    friend bool operator==(const A& l, const A& r) { return l.i == r.i; }
};

class B : private A {
public:
    using A::f;
};

int main() {
    B b, b2;
    b.f();
}
Run Code Online (Sandbox Code Playgroud)

b.f()因为using A::f在定义中是可能的B.

是否有可能编写一个类似的声明,它可以使友元函数的up-cast B&成为A&可能operator==(A&, A&),以便b == b2可以调用main()

c++ using friend c++11 c++14

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

为什么shared_ptr有一个移动构造函数

在C++ 11中std::shared_ptr有一个移动构造函数和移动赋值运算符.

有没有理由需要这样做,即如果只有复制构造函数和赋值运算符,任何使用它的程序会有不同的行为吗?

似乎它的唯一影响是避免了参考计数器的额外增量和后来的减少.

c++ stl language-lawyer c++11

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

从父命名空间重载类型

这似乎可以正确编译:

namespace A {
    template<typename T>
    struct S {};

    namespace B {
        using S = S<int>;
    }
}

int main() {
    using namespace A::B;
    S s;
}
Run Code Online (Sandbox Code Playgroud)

即使在这一行using S = S<int>,第一个S是指A::B::S,而第二个S是指模板A::S

这是标准的 C++ 吗?

c++ namespaces c++11 c++14

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

仅在满足依赖性时才加载共享库

我有一个链接到两个共享库的可执行文件,每个共享库都依赖于系统共享库.(在这种情况下,这些是OpenCL和CUDA运行时库,但这不会影响问题)

     +--> libA.so  --->  libOpenCL.so (on system)
Exe -|
     +--> libB.so  --->  libcudart.so (on system)
Run Code Online (Sandbox Code Playgroud)

Exe连同libA.solibB.so被分发给用户.用户可能没有libOpenCL.so和/或libcudart.so安装在他们的系统上.

目标是Exe应该能够反正启动,并在运行时检测例如libA.so由于不满足其依赖性而无法加载.

一种可能性是使其libA.so在运行时使用dlopen(),在它检测加载是否失败的情况下加载.

是否也可以正常连接libA.soExe,但在某种程度上Exe还是可以开启如果libA.so无法加载?这在Linux和/或Windows平台上是否可行?

c linux windows linker dynamic-linking

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

计算AVX2向量中每个元素的前导零位,模拟_mm256_lzcnt_epi32

使用AVX512,有一个internal函数_mm256_lzcnt_epi32,该函数返回一个向量,该向量对于8个32位元素中的每个元素,包含输入向量元素中前导零位的数量。

是否有仅使用AVX和AVX2指令来实现此目标的有效方法?

目前,我正在使用一个循环,该循环提取每个元素并应用该_lzcnt_u32函数。


相关:要对一个大位图进行位扫描,请参见__m256i字中的前导零计数,该字使用pmovmskb->位扫描以找到要执行标量位扫描的字节。

这个问题是关于当您实际上要使用全部8个结果而不仅仅是选择一个时,对8个单独的32位元素执行8个单独的lzcnts。

bit-manipulation simd avx avx2 avx512

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

内存映射文件是否为大缓冲区提供了优势?

我的程序适用于需要存储在连续内存(几千兆字节)中的大型数据集.使用std::allocator(即mallocnew)分配内存导致系统停顿,因为大部分虚拟内存被保留,物理内存被填满.

由于程序一次只能处理一小部分,我的问题是如果使用内存映射文件会提供一个优势(即mmapWindows等价物).这就是创建一个大的稀疏临时文件并将其映射到虚拟内存.或者是否有另一种技术会改变系统的分页策略,以便一次将较少的页面加载到物理内存中.

我试图避免构建一个一次加载文件部分的流机制,而是依赖于系统的vm分页.

c c++ memory-management mmap large-data

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

为什么C++ 11没有模板typedef?

为什么C++ 11没有"模板类型定义",比如

template<typename T> typedef std::vector<T, myalloc<T>> vec;
Run Code Online (Sandbox Code Playgroud)

相反,他们只允许新语法:

template<typename T> using vec = std::vector<T, myalloc<T>>;
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++11

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

在 CUDA NVRTC 代码中包含 C 标准头文件

我正在编写一个在运行时使用 NVRTC(CUDA 9.2 版和 NVRTC 7.5 版)编译的 CUDA 内核,它需要stdint.h头文件,以便拥有int32_t等类型。

如果我编写没有包含的内核源代码,它可以正常工作。例如内核

extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)

编译为 PTX 代码,其中 f 定义为.visible .entry f.

但是如果内核源代码是

#include <stdint.h>
extern "C" __global__ void f() { ... }
Run Code Online (Sandbox Code Playgroud)

它报告A function without execution space annotations (__host__/__device__/__global__) is considered a host function, and host functions are not allowed in JIT mode.(也没有extern "C")。

传递-default-device使 PTX 代码.visible .func f,因此无法从主机调用该函数。

有没有办法在源代码中包含标题,并且仍然具有__global__入口功能?或者,一种知道 …

preprocessor cuda stdint nvrtc

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