缓冲区填充了ä¸åŒç±»åž‹çš„æ•°æ®ï¼Œå¹¶è¿›è¡Œäº†ä¸¥æ ¼çš„别å处ç†

时间:2018-08-20 12:02:31

标签: c++ c++11 c++14 strict-aliasing

æ ¹æ®the standard,在C ++中,例如使float*指å‘与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]);

是å¦æœ‰ä¸€ç§æ–¹æ³•å¯ä»¥ä½¿reinterpret_cast指针的情况在C ++标准内得到良好定义,而无需对整个缓冲区进行附加的内存å¤åˆ¶æˆ–按元素的å¤åˆ¶ï¼ˆä¾‹å¦‚,使用{{1} })?

2 个答案:

答案 0 :(得分:6)

尽管我一直希望有一ç§ä¸é”™çš„方法,但目å‰è¿˜æ²¡æœ‰ã€‚您将必须使用所选编译器的no-strict-aliasing标志。

对于std::bit_cast,您将ä¸å¾—ä¸ç­‰åˆ°C++20。æ®æˆ‘所知,如果ä¸ä½¿ç”¨memcpy,就没有标准的符åˆæ–¹å¼ã€‚

也请看一下bit_cast proposal和this website。

答案 1 :(得分:0)

使用工会怎么样?例如:

union T {
    std::int32_t i;
    float f;
}

T* buffer = allocate_buffer();
for(int i = 0; i < num_items; ++i)
    buffer[i].f = transform(buffer[i].i);