小编Ser*_*tch的帖子

如果基类没有成员,派生C++类的大小是多少?

考虑以下继承:

class Base {
protected:
  Base() { }
public:
  double Multiply(double x);
};

class Derived : public Base {
  double _value;
public:
  Derived(double init) : _value(init) { }
  double Multiply(double x) { return x*_value; }
};
Run Code Online (Sandbox Code Playgroud)

此代码段将用于模板化代码库.多态性不是一种选择,因为它添加了VTable指针,从而使内存消耗增加了一倍.

但是,我怀疑由于C++要求对象的大小至少为1个字节,因此大小Derived将变为9个字节,因此,由于填充/对齐,它将进一步变为16个字节.

那么在C++中有一种方法可以保持大小Derived等于double(通常为8个字节)的大小吗?标准说的大小是Derived什么?特别是,在这种情况下,MSVC++如何表现?

c++ generics size inheritance sizeof

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

用于 x86_64 上 32 位和 64 位值的非临时加载的 C/C++ 内在函数?

x86_64 上是否有针对 32 位和 64 位值的非临时加载(即直接从 DRAM 加载,无需缓存)的 C/C++ 内在函数?

我的编译器是MSVC++2017工具集v141。但其他编译器的内在函数以及对底层汇编指令的引用也是受欢迎的。

c c++ assembly intrinsics cpu-cache

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

WC vs WB内存?x86_64上的其他类型的内存?

你能描述一下x86_64上WC和WB内存的含义和区别吗?为了完整起见,请在x86_64上描述其他类型的内存,如果有的话.

memory assembly x86-64 memory-mapping cpu-cache

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

默认lambda作为函数的模板化参数

请考虑以下代码

template<bool b, typename T> void foo(const T& t = []() {}) {
  // implementation here
}

void bar() {
  foo<true>([&](){ /* implementation here */ }); // this compiles
  foo<true>(); // this doesn't compile
}
Run Code Online (Sandbox Code Playgroud)

在不编译的情况下,我得到以下错误:

error C2672: 'foo': no matching overloaded function found
error C2783: 'void foo(const T&)': could not deduce template argument for 'T'
Run Code Online (Sandbox Code Playgroud)

我认为我想要实现的目标很明确:让我们foo在没有客户提供的lambda的情况下调用它.编译器是MSVC++ 2017版本15.4.4工具集v141.

c++ lambda templates default-parameters c++17

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

如何在 Visual Studio 解决方案中升级 CUDA 版本?

早些时候我安装CUDA 9.2在我的机器上并用它构建了一个解决方案。然后我升级Visual Studio 2017到了 不支持的修订版CUDA 9.2,所以我收到如下错误:

1>D:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\bin\nvcc.exe" -gencode=arch=compute_61,code=\"sm_61,compute_61\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64" -x cu -rdc=true -ID:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore\ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" --source-in-ptx -G -lineinfo  --keep-dir x64\Debug -maxrregcount=32  --machine 64 --compile -cudart static  -g   -D_DEBUG -D_WINDOWS -D_USRDLL -DPQACORE_EXPORTS -D_WINDLL -D_UNICODE -DUNICODE -Xcompiler "/EHsc /W4 /nologo /Od /FS /Zi /RTC1 /MDd /GR" -o x64\Debug\CudaEngineGpu.cu.obj "D:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore\CudaEngineGpu.cu"
1>c:\program files\nvidia gpu computing …
Run Code Online (Sandbox Code Playgroud)

cuda upgrade build visual-studio

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

使用CreateFile打开FILE*

有没有办法FILE*根据WinAPI CreateFile在C++中返回的句柄创建stdio的结构?

c++ winapi fopen file createfile

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

有没有机会用SIMD加速重复代码?

考虑以下代码,其中a是一个参数数组,float并且s是一个最初未初始化的结果数组float:

s[n - 1] = mu * a[n - 1];
for (int j = n - 2; j >= 0; j--)
    s[j] = mu * (a[j] + s[j + 1]);
return s;
Run Code Online (Sandbox Code Playgroud)

有没有机会用SIMD(AVX2)改善这种重复代码的性能?

编辑:我后来发现这个公式/算法被称为"折扣金额",但无法在互联网上找到它的并行版本.

c++ performance simd vectorization avx2

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

编译到ARM我得到"错误:尝试在Thumb-only处理器上使用ARM指令"

以下命令

/usr/bin/arm-linux-gnueabihf-gcc -O3 -DNDEBUG -march=armv7-a -mfloat-abi=hard -fPIC -fno-builtin -fno-exceptions -fomit-frame-pointer -funwind-tables -fno-stack-protector -fvisibility=hidden -fvisibility-inlines-hidden -fno-function-sections -fno-lto -g -Wno-variadic-macros -Wno-non-virtual-dtor -o testAsm.S.o -c testAsm.S
Run Code Online (Sandbox Code Playgroud)

在以下程序集文件中testAsm.S:

    .syntax unified
    .arch armv7
    .fpu vfpv3
    .code 32
    .global _functionPointer
    .p2align 2
    .global _asmFunction
    .type _asmFunction, %function
_asmFunction:
    PUSH {r1-r3,lr}
    VPUSH {d0-d7}
    MOVW r1,#:lower16:_functionPointer
    MOVT r1,#:upper16:_functionPointer
    LDR r2, [r1]
    CMP r2, #0
    BEQ asmFunction_restore
    MOV r1, #0
    BLX r2
asmFunction_restore:
    VPOP {d0-d7}
    POP {r1-r3,pc}
Run Code Online (Sandbox Code Playgroud)

每条指令产生以下错误

错误:尝试在仅Thumb处理器上使用ARM指令

具体来说,下面是输出:

testAsm.S: Assembler messages:
testAsm.S:10: Error: attempt to …
Run Code Online (Sandbox Code Playgroud)

assembly gcc arm thumb

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

cudaHostAllocMapped 是否也在设备上分配缓冲区?

文档cudaHostAlloc()说,与cudaHostAllocMapped标志它分配固定的主机和“地图分配到CUDA地址空间的”内存。这是否意味着在设备上也分配了镜像缓冲区?无论是在通话中cudaHostAlloc()还是cudaHostGetDevicePointer()通话中。或者设备是否在每次访问由 返回的指针时与主机内存进行通信cudaHostGetDevicePointer()

这个问题不同于何时使用 cudaHostRegister() 和 cudaHostAlloc()?“Pinned or page-locked”内存是什么意思?哪些是 OpenCL 中的等价物?因为我不问 API 是什么、何时使用它们或什么是固定内存。我特别询问是否在 GPU 上分配了镜像缓冲区。

c++ memory cuda pci-e

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

像_alloca一样在堆栈上分配对齐的内存

文档在这里_alloca()说:

_alloca 例程返回一个指向已分配空间的 void 指针,保证该空间能够适当对齐以存储任何类型的对象。

然而,这里说:

_alloca 需要 16 字节对齐,并且还需要使用帧指针。

因此,似乎在第一个参考文献中,他们忘记了 32 字节对齐的 AVX/AVX2 类型,例如__m256d.

另一件让我困惑的事情是,第一页说_alloca()已弃用,而它建议使用可以从堆而不是堆栈分配内存的函数(这在我的多线程应用程序中是不可接受的)。

那么有人可以指出我是否有一些现代的(也许是新的 C/C++ 标准?)方法来对齐堆栈内存分配?

说明 1:请不要提供需要数组大小为编译时常量的解决方案。我的函数根据运行时参数值分配可变数量的数组项。

c++ memory-management alloca c11 c++17

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