C++¿¡¼ buffer(³»ºÎ°¡ char, unsigned char, ȤÀº std::byte·Î ÀÌ·ç¾îÁø array ȤÀº heap¿¡ ÇÒ´çµÈ array) ¿¡ C++ Ç¥ÁØÀ» ¾î±âÁö ¾ÊÀ¸¸é¼ µ¥ÀÌÅ͸¦ ¾²°Å³ª Àаí½Í½À´Ï´Ù. ¾î¶»°ÔÇØ¾ßµÉ±î¿ä? Q: °£´ÜÇÏ°Ô ÀÌ·¸°ÔÇÏ¸é µÇÁö¾ÊÀ»±î¿ä?
¾ÈµË´Ï´Ù. À§ ÄÚµå´Â. C++ Ç¥ÁØÀ» ¾î±â°ÔµË´Ï´Ù.
Q: ¿¡ÀÌ ¼³¸¶¿ä, ¸ø¹Ï°Ú´Âµ¥¿ä?
°°ÀÌ C++ Ç¥ÁØÀ» È®ÀÎÇØº¾½Ã´Ù.
Ç¥ÁØ¿¡¼± °´Ã¼ÀÇ lifetimeÀº 1. definition (int a; // <- ÀÌ·±½ÄÀÇ Á¤ÀÇ) 2. new-expression (placement new, heapÇÒ´çÇÒ¶§ ¾²´Â new µÑ´Ù) 3. union¸â¹öÁß Çϳª¸¦ implicitly changeÇÒ¶§ 4. temporary object°¡ »ý¼ºµÉ¶§ Áß ÇϳªÀÇ °úÁ¤À» °ÅÃľ߸¸ ½ÃÀÛÀÌ µÈ´Ù°í ÇÕ´Ï´Ù.
°´Ã¼ÀÇ lifetimeÀ» ½ÃÀÛÇÏ´Â À§¿¡ ³ª¿µÈ 4°³Áß ¾î´À°ÍÀÇ °úÁ¤À» °ÅÄ¡Áö ¾ÊÀº°÷À» Á¢±ÙÇÏ´Â ÇàÀ§´Â undefined behaviorÀÔ´Ï´Ù. (int*·Î ¾îµò°¡¸¦ °¡¸£Å°°íÀִµ¥ int °´Ã¼°¡ ¾ø´Â°÷)
À§ ¿¹Á¦ Äڵ忡 buf*°¡ °¡¸£Å°´Â°ÍÀº unsigned char[4] ÀÔ´Ï´Ù. ´Ù¸¥ ŸÀÔÀ¸·Î C-style cast¸¦ Çϵç reinterpret_cast¸¦ Çϵç buf°¡ ¹«¾ùÀ» °¡¸£Å°´ÂÁö´Â ¹Ù²îÁö ¾Ê½À´Ï´Ù.
Q: Undefined behavior°¡ ±×·¡¼ Á¤È®È÷ ¹¼´Ï±î?
UB¸¦ invokeÇÏ´Â Äڵ带 ÄÄÆÄÀÏÇÒ °æ¿ì ÄÄÆÄÀÏ·¯´Â Àڱ⠸¾´ë·Î Äڵ带 § »ç¶÷ÀÇ Àǵµ¿Í ÀüÇô»ó°ü¾ø´Â ¹ÙÀ̳ʸ®¸¦ »ý¼ºÇÒ¼öÀÖ½À´Ï´Ù. (aggressive-optimizationÁß¿¡ ÀǵµµÈ ÄÚµå¿Í ´Ù¸¥ outcomeÀÌ ³ª¿Â´Ù´øÁö, crash, memoryleak, µî ¹«¾ùÀ̵ç¿ä.) ¹°·Ð ¾ÆÁ÷±îÁø Çö½ÇÀûÀ¸·Î À§ÀÇ Äڵ忡¼ ÇÁ·Î±×·¥ÀÌ »¶³ª°Å³ª ¸Þ¸ð¸® ¸¯ÀÌ»ý±â´ÂÀÏÀº ¾ø´Ù°íºÁµµ ¹«¹æÇÕ´Ï´Ù.
Q: ¾Æ´Ï±×·¯¸é ¾î¶»°ÔÇØ¾ßµÇ³ª¿ä?
write¿¡¼± memcpy¸¦ ºÒ·¯Áֽðí, read¿¡¼± À§¿¡ °´Ã¼°¡ »ý¼ºµÇ´Â °úÁ¤Áß 1¿¡ ÇØ´çÇÏ´Â T ret_; À» ¼±¾ðÇÑµÚ ret_¿¡ memcpy ÇÏ½Ã¸é µË´Ï´Ù. ¹°·Ð typename T °¡ std::is_trivially_copyable_v<T> == true ¿¡ ºÎÇÕÇØ¾ßÇÕ´Ï´Ù.
À§¸¦ Á»´õ ÆíÇϰÔ(type-punningÀ» °¡´ÉÇϰÔ)ÇÏ´Â ÇÔ¼ö°¡ C++20¿¡ µé¾î¿É´Ï´Ù. ¹«·Á constexpr ÇÔ¼ö·Î¿ä.
constexpr memcpy´Â ÄÄÆÄÀÏ·¯ ¸ÅÁ÷ÀÌ ÇÊ¿äÇÏÁö¸¸ ±×³É memcpy·Îµµ c++11, 14, 17¿¡¼ Ç¥ÁØÀ» ÁöŰ¸é¼ type-punningÀÌ °¡´ÉÇÏ°Ô ÇØÁÝ´Ï´Ù.
Q: ±Ùµ¥ memcpyÇÏ¸é ±×³É ÀÏ¹Ý Æ÷ÀÎÅÍ Ä³½ºÆÃÇØ¼ Àд°ź¸´Ù ´À¸®Áö¾Ê³ª¿ä?
±Û½ê¿ä, °°ÀÌ È®ÀÎÇØº¼±î¿ä?
¼¼ major ÄÄÆÄÀÏ·¯µé ´Ù no-opÀ¸·Î optimize ÇØÁÝ´Ï´Ù.
Q: ³×Æ®¿öÅ©³ª i/o Ãß»óÈÇØÁØ ¶óÀ̺귯¸® ´ëºÎºÐ ¶â¾îº¸¸é Àú·±ÄÚµåµé ¸¹Àºµ¥ ¿©Å ¾Æ¹«·± ¹®Á¦ ¾ø¾ú¾î¿ä. »ó°ü ¾ø´Â°Å ¾Æ´Ñ°¡¿ä?
°³ÀÎÀûÀÎ ÀǰßÀ¸·Ð ¿ÀÈ÷·Á Ç¥ÁØ¿¡¼ Á¤ÀǵÇÁö ¾ÊÀº Äڵ尡 Áö±Ý ¹ö±×¸¦ ÀÏÀ¸Å°Áö ¾Ê´Â°Ô ´õ À§ÇèÇÏ´Ù°í »ý°¢ÀÌ µË´Ï´Ù. ½Ã°£ÀÌ1³â ȤÀº 2³â ȤÀº 10³â ÈÄ, ¾î´À³¯ °©ÀÚ±â ÄÄÆÄÀÏ·¯ º¥´õµéÀÌ UB trigger ÇÏ´Â ÄÚµåµéÀ» Àû±ØÀûÀ¸·Î optimizeÇÏ·ÁÇÏ´Â ÄÄÆÄÀÏ·¯µéÀ» ¸±¸®ÁîÇÏ°ÔµÇ¸é ±×¶§ ¹ö±×Àâ´Â°Ç »ó´çÈ÷ ¾î·Æ°ÚÁÒ. Ç÷§Æû Á¾¼Ó¼º¹®Á¦µµ »ý±æ°Å±¸¿ä.
±ä±Û ÀоîÁּż °¨»çÇÕ´Ï´Ù.
edit : ¾Æ ±×¸®°í »©¸ÔÀº°Ô Àִµ¥ gcc, clang¿¡¼´Â -fno-strict-aliasing Ä¿¸Çµå¸¦ ÄÄÆÄÀÏÇÒ¶§ ³Ñ°ÜÁÖ¸é strict-aliasing ·êÀ» À§¹ÝÇÏ´Â ÄÚµå¶óµµ ¾ÈÀüÇÑ ¹ÙÀ̳ʸ®°¡ »ý¼ºµË´Ï´Ù. ¹°·Ð À§ »óȲ¿¡¼µµ Á¦´ë·Î µ¿ÀÛÇØ¾ßµÇ±â¶§¹®¿¡ ÃÖÀûȸ¦ ´úÇϰÚÁÒ. Á¦°¡¾Ë±â·Î MSVC´Â ±×·±Ä¿¸Çµå´Â ¾ø´Âµ¥ º»Àεé <Windows.h> Çì´õ°°Àº°÷¿¡ strict-aliasingÀ» À§¹ÝÇÏ´Â ÄÚµåµéÀÌ ¸¹¾Æ¼ ¾ÆÁ÷ gcc³ª clangó·³ À§ »óȲ¿¡¼ optimizeÇÒ ¾öµÎ´Â ¾ÆÁ÷Àº ¸ø³¾°Å¿¡¿ä.
±×¸®°í C++23¿¡ ³ª¿À´Â std::start_lifetime_as<T>´Â ¿©±â¼ ´Ù·çÁö ¾Ê¾Ò´Âµ¥ C++23À̵Ǹé malloc, memcpy, memmove, std::start_lifetime_as<T> ³× ÇÔ¼öµµ °´Ã¼ÀÇ lifetimeÀ» ½ÃÀÛÇÒ¼öÀÖ°Ô Ç¥ÁØ¿¡ °ÇÀǰ¡µÈ »óÅÂÀÔ´Ï´Ù.
|