相关疑难解决方法(0)

缓冲区填充了不同类型的数据,并严格别名

根据标准,在C++中始终是未定义的行为,例如,float*指向与a 相同的内存位置int*,然后从它们读/写.

在我的应用程序中,可以有一个填充32位整数元素的缓冲区,它被32位浮点元素覆盖.(它实际上包含一个图像的表示,它由GPU内核在多个阶段进行转换,但是也应该有一个主机实现执行相同的处理,以进行验证.)

该程序基本上这样做(不是实际的源代码):

void* buffer = allocate_buffer(); // properly aligned buffer

static_assert(sizeof(std::int32_t) == sizeof(float), "must have same size");
const std::int32_t* in = reinterpret_cast<const std::int32_t*>(buffer); 
float* out = reinterpret_cast<float*>(buffer); 
for(int i = 0; i < num_items; ++i)
   out[i] = transform(in[i]);
Run Code Online (Sandbox Code Playgroud)

有没有办法reinterpret_cast在C++标准中明确定义指针大小写,而不需要为整个缓冲区做额外的内存副本,或者额外的每个元素副本(例如std::bit_cast)?

c++ strict-aliasing c++11 c++14

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

如何进行C++对齐的数组分配?

我想修改一个数组分配:

 float * a = new float[n] ;
Run Code Online (Sandbox Code Playgroud)

使用对齐的分配器。我倾向于尝试使用placement new 和posix_memalign(或新的c++11 等价物),但看到placement new with arrays 在数组分配方面存在问题,因为编译器可能需要为计数或其他元数据提供额外的存储空间

我试过:

int main()
{
   float * a = new alignas(16) float[3] ;

   a[2] = 0.0 ;

   return a[2] ;
}
Run Code Online (Sandbox Code Playgroud)

但编译器似乎表明 alignas 被忽略:

$ g++ -std=c++11 t.cc -Werror
t.cc: In function ‘int main()’:
t.cc:4:39: error: attribute ignored [-Werror=attributes]
    float * a = new alignas(16) float[3] ;
                                       ^
t.cc:4:39: note: an attribute that appertains to a type-specifier is ignored
Run Code Online (Sandbox Code Playgroud)

看起来使用 alignas …

c++ arrays alignment

8
推荐指数
2
解决办法
9412
查看次数

标签 统计

c++ ×2

alignment ×1

arrays ×1

c++11 ×1

c++14 ×1

strict-aliasing ×1