æ ¹æ®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} })?
ç”案 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);