๊ตฌ์กฐ์ฒด ํจ๋ฉ์ ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๊ฐ๋ ์ด๋ค. ์ปดํจํฐ ์ํคํ ์ฒ ๋๋ถ๋ถ์ ํน์ ๋ฐ์ดํฐ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ ฌ๋ ์ฃผ์์์ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ์ ํธํ๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ ์์คํ ์์๋ 4๋ฐ์ดํธ ์ ์(int)๋ฅผ 4๋ฐ์ดํธ ๊ฒฝ๊ณ์์ ์์ํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ ๋น ๋ฅด๋ค. ์ด๋ฌํ ์ ๋ ฌ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ์ปดํ์ผ๋ฌ๋ ๊ตฌ์กฐ์ฒด ๋ด์ ํ๋ ์ฌ์ด์ "ํจ๋ฉ" ๋ฐ์ดํธ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋๋ฅผ ์ต์ ํํ๋ค.
โญ1. ๊ตฌ์กฐ์ฒด ํจ๋ฉ์ ํ์์ฑ
1.1.๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋ ์ต์ ํ: ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ค์ ์์ฐ ์ ๋ ฌ ๊ฒฝ๊ณ์ ๋ง์ถฐ ์ ์ฅํจ์ผ๋ก์จ, CPU๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ ๋น ๋ฅด๊ฒ ์ฝ๊ณ ์ธ ์ ์๋ค.
1.2.ํ๋ซํผ ํธํ์ฑ: ๋ค์ํ ํ๋ซํผ๊ณผ ์ํคํ
์ฒ์์ ์ฝ๋์ ๋์์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ค.
โญ2. ํจ๋ฉ์ด ๋ฐ์ํ๋ ์์ธ
๋ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ณ ๋ คํด๋ณธ๋ค:
typedef struct {
char a; // 1๋ฐ์ดํธ
int b; // 4๋ฐ์ดํธ
} Example;
char ํ์ ์ a๋ 1๋ฐ์ดํธ๋ง ์ฐจ์งํ๋ค. ๊ทธ๋ฌ๋ int ํ์ ์ b๋ 4๋ฐ์ดํธ ๊ฒฝ๊ณ์ ๋ง์ถฐ ์ ๋ ฌ๋์ด์ผ ํ๋ค. ์ด ๊ฒฝ์ฐ, a์ b ์ฌ์ด์ 3๋ฐ์ดํธ์ ํจ๋ฉ์ด ์ฝ์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ์ด 1๋ฐ์ดํธ + 3๋ฐ์ดํธ (ํจ๋ฉ) + 4๋ฐ์ดํธ๋ก 8byte๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
โญ3. ํจ๋ฉ ์ต์ํ
์๋์ ์์ ์ฝ๋๋ ์ธ ๊ฐ์ง ๋ฒ์ ์ SensorData ๊ตฌ์กฐ์ฒด๋ฅผ ๋น๊ตํ๋ค:
์ต์ ํ๋์ง ์์ ๋ฒ์ , ์๋์ผ๋ก ์ต์ ํ๋ ๋ฒ์ , ๊ทธ๋ฆฌ๊ณ ์ปดํ์ผ๋ฌ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๋ฒ์ ์ด๋ค. ์ด๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๊ฐ ์ด๋ป๊ฒ ๋ณํ๋์ง ํ์ธํ ์ ์๋ค.
3.1. ์ต์ ํ๋์ง ์์ ๊ตฌ์กฐ์ฒด: ํ๋๊ฐ ์ ์ธ๋ ์์๋๋ก ๋ฐฐ์น๋๋ค. ์ด ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ ์๋์ผ๋ก ํจ๋ฉ์ ์ฝ์
ํ ์ ์๋ค.
3.2. ์๋์ผ๋ก ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด: ๋ฐ์ดํฐ ํ์ ์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํ๋๋ฅผ ์ฌ๋ฐฐ์ดํ์ฌ ํจ๋ฉ์ ์ต์ํํ๋ค.
3.3. ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด (__attribute__((packed))): ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ ํ ํจ๋ฉ๋ ์ถ๊ฐํ์ง ์๋๋ก ์ง์ํ์ฌ ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์ต์ํํ๋ค.
#include <stdio.h>
// ์ต์ ํ๋์ง ์์ ๊ตฌ์กฐ์ฒด
typedef struct {
char status; // 1 byte
int temperature; // 4 bytes
char config; // 1 byte
// Potential padding here
} UnoptimizedSensorData;
// ์๋์ผ๋ก ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด
typedef struct {
int temperature; // 4 bytes
char status; // 1 byte
char config; // 1 byte
// Less or no padding compared to UnoptimizedSensorData
} OptimizedSensorData;
// ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด
typedef struct {
char status; // 1 byte
int temperature; // 4 bytes without padding due to directive
char config; // 1 byte
} __attribute__((packed)) PackedSensorData;
int main() {
printf("์ต์ ํ๋์ง ์์ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ: %zu ๋ฐ์ดํธ\n", sizeof(UnoptimizedSensorData)); // 12byte
printf("์๋์ผ๋ก ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ: %zu ๋ฐ์ดํธ\n", sizeof(OptimizedSensorData)); // 8byte
printf("์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด ํฌ๊ธฐ: %zu ๋ฐ์ดํธ\n", sizeof(PackedSensorData)); // 6byte
return 0;
}
์ด ์ฝ๋๋ ๋ค์์ ์ํํ๋ค:
๊ฐ ๊ตฌ์กฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ sizeof ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ฅผ ํตํด ๊ตฌ์กฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋น๊ตํ ์ ์๋ค.
์ต์ ํ๋์ง ์์ ๋ฒ์ ์์๋ int ํ์
ํ๋ ์ฌ์ด์ ์๋ char ํ์
ํ๋๋ก ์ธํด ์ถ๊ฐ ํจ๋ฉ์ด ๋ฐ์ํ ์ ์๋ค.
์๋์ผ๋ก ์ต์ ํ๋ ๋ฒ์ ์์๋ ํ๋๋ฅผ ์ฌ๋ฐฐ์ดํ์ฌ ์ถ๊ฐ ํจ๋ฉ์ ๊ฐ๋ฅ์ฑ์ ์ค์ธ๋ค.
์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๋ฒ์ ์์๋ __attribute__((packed))๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํจ๋ฉ์ ์ ๊ฑฐํ๊ณ , ๊ตฌ์กฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ฅํ ์ต์๋ก ๋ง๋ ๋ค.
์คํ ๊ฒฐ๊ณผ๋ ์ปดํ์ผ๋ฌ์ ์ํคํ
์ฒ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ผ๋, ์ผ๋ฐ์ ์ผ๋ก ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ์ต์ ํ๋ ๊ตฌ์กฐ์ฒด๊ฐ ๊ฐ์ฅ ์์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. ๊ทธ๋ฌ๋, ๋น์ ๋ ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ผ๋ก ์ธํด ์ฑ๋ฅ ์ ํ๋ ํ๋ซํผ์ ๋ฐ๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ฌ์ฉ ์ ์ฃผ์๊ฐ ํ์ํ๋ค.
'๐ท C์ธ์ด 30๊ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++ Tip] 7. ๋ฐฐ์ด์ ๊ธฐ์ด (1) | 2024.09.04 |
---|---|
[C/C++ Tip] 6. UNION ๊ณต์ฉ์ฒด์ STRUCT ๊ตฌ์กฐ์ฒด๋ก ํจํท ๋ง๋ค๊ธฐ (2) | 2024.09.04 |
[C/C++ Tip] 4. ๊ตฌ์กฐ์ฒด ํ์ฉ: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ (2) | 2024.09.02 |
[C/C++ Tip] 3. ์ฝ๋ฉ ๊ท์น. ๋ณ์๋ช ์ ํ๊ธฐ (0) | 2024.09.01 |
[C/C++ Tip] 2. #define์ ๋ชฉ์ (0) | 2024.09.01 |