Memory κ΄λ ¨ μ¬λ¬κ°μ§ μ 리. Bit operationμΌλ‘ /64 μ€μ΄κΈ° κ°μ κ²μ μ νλ €λ©΄ μμμΌ νλ λλͺ© μ€ νλμ΄λ€.
μ°μ μ΄μΌκΈ°λ₯Ό μμνκΈ°μ μμ, μ¬κΈ°μ μ΄μΌκΈ°νλ λ©λͺ¨λ¦¬λ Application
κ΄μ μμμ λ©λͺ¨λ¦¬μ΄λ€. μ¦, κ°μλ©λͺ¨λ¦¬λ₯Ό λ»νλ€. (물리μ μΈ μ€μ λ©λͺ¨λ¦¬λ Appλ¨μμ μ κ·Όλ μλλ€) μ΄ κ²½μ°, κ° μμ€ν
μ μν€ν
μ³μ λ°λΌ κ°μ©ν κ°μλ©λͺ¨λ¦¬ ν¬κΈ°κ° λ¬λΌμ§ κ²μ΄λ€.
μ΄ κΈμμλ νΈμμ μΌλ°μ μΈ 32 bit
μμ€ν
κ³Ό 4GB
μ λ©λͺ¨λ¦¬λ₯Ό κ°μ ν΄λ³Έλ€. 4GB
μ λ©λͺ¨λ¦¬ μμΉλ κ·Έλ₯ λμ¨ κ²μ μλκ³ , 32 bit
μμ€ν
μ΄λΌλ©΄ νΈνκ² κ°μ Έκ° μ μλ μ£Όμκ° λν 32 bit
κ° λκ³ , μ΄ μκ° 0xFFFFFFFFU
μ΄λ―λ‘ μ¬μ©κ°λ₯ν λ©λͺ¨λ¦¬κ° 4GB
λΌκ³ νΈνκ² μ΄μΌκΈ° νλ κ²μ΄λ€. λ¨, μ¬κΈ°μ λ¨μλ bit
κ° μλκ³ byte
μμ μ μνμ. λ©λͺ¨λ¦¬ ꡬ쑰μ λΉνΈλ¨μμ ν λΉμ κ°λ₯νμ§λ μκ³ ν¨μ¨μ μ΄μ§λ μλ€. κ·Έλμ ν μ£Όμ λ²μ§μ (μ΄λ₯Όν
λ©΄ 0x10002411
)μλ 1 byte
= 8 bit
μ λ°μ΄ν°κ° μ μ₯λμ΄ μλ κ²μ΄λ€.
λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ€λ κ²μ 무μμΌκΉ? μ ννλ κ° νλ‘μΈμ€κ° κ°μ§κ³ μλ 4GB
μ κ°μλ©λͺ¨λ¦¬μ ν λΉνλ€λ κ²μΌ κ²μ΄λ€. ν λΉμ΄λ 무μμΌκΉ? λ΄κ° νΉμ μμΉμ μλ λ©λͺ¨λ¦¬ κ°μ μμΌλ‘ μ¬μ©ν κ²μ΄λ€ λΌλ μ μΈμ΄λ€. μ΄ λ©λͺ¨λ¦¬μμ μμΉλ λ΄κ° λ§μλλ‘ μ νλ κ²μ΄ μλλΌ malloc
κ³Ό κ°μ ν¨μλ₯Ό ν΅ν΄ μ»κ²λλ€. μ΄λ° κ³Όμ μ΄ ν λΉ
μ΄λ€.
ν λΉλ°μ μ£Όμκ°μ 32 bit
μμ€ν
μμ 32 bit
κ° λλ€. μ΄λ₯Όν
λ©΄ 0x10002411
μ£Όμλ₯Ό μμΌλ‘ μ°κ² λ€ λΌκ³ νλ€λ©΄ μμΌλ‘ μ μ£Όμμ μλ κ°μ μ μλ―Ένκ² νμ©νκ² λ€λΌλ λ»μ΄ λλ€. ν λΉ μ μ λ©λͺ¨λ¦¬ κ°μ μΌλ°μ μΌλ‘ 보μ₯ν μ μλ€. λ°λΌμ ν λΉκ³Ό λμμ λ©λͺ¨λ¦¬ μ΄κΈ°ν μμ
μ΄ νμνλ€.
int* ptr;malloc(ptr, sizeof(int) * 1000);memset(ptr, 0, sizeof(int) * 1000);
νν μΈνΈλ‘ μ°μ΄λ μ C μ½λκ° κ·Έλ¬ν κ³Όμ μ κ±°μΉλ€. μ΄ 4 * 1000 byte
λ₯Ό ν λΉνλ©΄μ κΈ°μ‘΄μ κ°μ 보μ₯ν μ μμΌλ memset
μ ν΅ν΄ μ΄κΈ°νλ₯Ό νλ€.
κ·Έλ°λ°, μ κ³Όμ μ μ’ μΆμμ μΌλ‘ λκ»΄μ§λ€. μλλ©΄, malloc
μ ν΅ν΄μ μ£Όμκ°μ ν λΉ λ°λλ€λ κ²μ μκ² λλ°, μ€μ λ‘ μ΄λ μ£Όμκ°μ λ°λλ€λ κ²μΈμ§? κ·Έ ν΄λ΅μ΄ μλ κ·Έλ¦Όμ΄λ€.
μμ€ν
μ μν€ν
μ³λ μ΅λν λ¨μν΄μΌν νμκ° μλ€. μ΄ 4GB
μ λ©λͺ¨λ¦¬ μ£Όμλ₯Ό ν λΉν λ, μ€κ° μ€κ° μ£Όμκ°μ ν λΉν μλ μκ² μ§λ§, κ·Έλ¬λ©΄ λλΉκ° μκΈΈ κ°λ₯μ±μ΄ λλ€. κ·Έλμ, ν¬κ² μμͺ½λΆν° (stack), λ μλμͺ½λΆν° (heap), λ©λͺ¨λ¦¬ 곡κ°μ μ¬μ©νλ€. μμμ μμλ‘ λ€μλ malloc
μ κ²½μ°, heap
곡κ°μ μ¬μ©νλ€. heap
μ 무λκΈ°, λλ―Έμ κ°μ λ»μ κ°μ§λ©° κ·Έλ¦Όμ μλ λΆλΆμ΄λ€. stack
μ κ²½μ° μ§μλ³μλ ν¨μ νΈμΆ μ μ¬μ©λλ λΆλΆμ΄λ©° μμͺ½λΆν° μ°¨κ² λλ€. stack
곡κ°μ μΌλ°μ μΌλ‘ ν¬κΈ°κ° μμ² ν¬μ§ μμ μ νμ΄ μ’ λΉ‘μΌ νΈμ΄λ©°, κ·Έλμ μ’
μ’
overflowκ° λ°μνλ€. μ΄κ²μ stack overflow
λΌκ³ λΆλ₯Έλ€. (μ λͺ
ν μ¬μ΄νΈλ μλ€)
stack
μ μμ μ§§κ² μΈκΈν κ²μ²λΌ ν¨μ νΈμΆμμλ μμ΄κΈ° λλ¬Έμ, μ’
μ’
μ¬κ·ν¨μλ DFS
λ₯Ό ꡬνν λ ν°μ§κ² λλ μμΈμΌλ‘ μμ©νκΈ°λ νλ€. λ, μ ννλ€ μ μλ³μμλ€κ° λ°°μ΄μ μ μΈνλμ§λ μ μ μλ€. μ΄λ¬ν λ©λͺ¨λ¦¬ ꡬ쑰λ₯Ό μκ³ λλ©΄ ν°μ§λ κ²μ μ€μ΄μ§λ λͺ»νλλΌλ μ ν°μ§λμ§λ μ μ μλ€.
μμμ λ©λͺ¨λ¦¬ μ£Όμκ°μ κ΄ν μ΄μΌκΈ°λ₯Ό νλ€λ©΄ λ€μμΌλ‘λ μλ£νμ λν μ΄μΌκΈ°κ° νμμ μ΄λ€. μλ£νμ΄ λ©λͺ¨λ¦¬μ λ§€νλλ λ°©μμ μλμ κ°λ€.
struct mydata{int number1;char string1[15];int number2;double floating_point1;char char1;float floating_point2;short short1;int number3;double floating_array[3];} d;d.number1 = 1234567;strcpy(d.string1, "Hello world!");d.number2 = 1;d.floating_point1 = 2.0;d.char1 = 1;d.floating_point2 = 999.999;d.short1 = 30000;d.number3 = -1;d.floating_array[0] = 1.0;d.floating_array[1] = 2.0;d.floating_array[2] = 3.0;
μ μμλ Little Endian
μ μ¬μ©ν μμμ΄λ€. μ£Όμν μ μ΄μ μλ©΄ μ’μ μ μ΄ λκ°μ§κ° μλ€.
int
νμ κ²½μ° 4 byte
λ₯Ό μ¬μ©νλλ°, μμμ μΈκΈν κ²μ²λΌ, λ©λͺ¨λ¦¬μ κΈ°λ³Έ λ¨μλ 1 byte
μ΄λ€. μ¦, 1 byte
λ₯Ό μ΄λ€ μμλ‘ 4 byte
μ λ°°μ΄ν κ²μΈκ°μ λν λ¬Έμ κ° μκΈ΄λ€. μ΄λ₯Ό ν΄κ²°νλ λ°©λ²μ΄ λκ°μ§κ° μλλ°, λ³΄ν΅ Little Endian
, Big Endian
μ΄λΌκ³ λΆλ₯΄κ³€ νλ€. μμΈν λ΄μ©μ κ²μν΄λ³΄λλ‘ νμ.C/C++
κ³Ό κ°μ μΈμ΄λ νλ³νμ΄ μμ λ‘λ€. μ΄λ₯Όν
λ©΄ char ννμ λ°°μ΄μ int* p = (int*) charArr;
μ κ°μ μμΌλ‘ λ³νν΄μ μ κ·Όν μ μλλ°, μ΄λ κ² ν κ²½μ° 4byte
λ₯Ό νλ²μ λ€λ£° μ μλ€. μ΄ λΆλΆμ κ°λ μ±λ₯μ λμ΄λλ°μ λμμ΄ λ μ μμ΄μ μλμ κ°μ μμμ½λλ₯Ό νλ 첨λΆνλ€. λ¬Όλ‘ memset νλ©΄ λλ λΆλΆμΈλ° λμΆ© μ΄λ° λλμ΄λ€ νκ³ μ΄ν΄νκΈ° μ’μμ 첨λΆνλ κ²..void init(char myArr[1'000'000]) {unsigned long long *ullp = (unsigned long long*)myArr;for(int i = 0; i < 125'000; ++i)ullp[i] = 0;}
μΌλ¨ νν μ°μ΄λ int νμ λν΄μ, μ«μ 32
λ₯Ό λ©λͺ¨λ¦¬ μ£Όμ 0xA0000000
μ λ£κ³ μΆλ€κ³ κ°μ ν΄λ³΄μ. μ€μ λ©λͺ¨λ¦¬μ ν΄λΉ κ°μ΄ μ΄λ»κ² μ¬λΌκ° μμκΉ? (Endian μμ€ν
μ λ°λΌ λ¬λΌμ§μ§λ§.. μ°μ Little Endian
μμμ μμλ₯Ό μ΄ν΄λ³Έλ€)
0xA0000000 | 0xA0000001 | 0xA0000002 | 0xA0000003 |
---|---|---|---|
0x20 | 0x00 | 0x00 | 0x00 |
μ¬κΈ°μ 32
κ° μλ 0x20
μ΄ λ€μ΄κ° μ΄μ λ 16μ§λ²μ μ¬μ©νκ³ μκΈ° λλ¬Έμ΄λ€. μ νμ κ°μ΄, νλμ μ£Όμ 곡κ°μ 1 byte
κ° λ€μ΄κ°κ³ , μ΄ 4 byte
곡κ°μ κ±Έμ³μ λ°μ΄ν°κ° λ€μ΄κ°λ€.
μμλ₯Ό νλλ§ λ 보μ. μ΄λ²μ λ¬Έμμ΄ "Hello" κ° κ°μ 곡κ°μ μ μ₯λ κ²½μ°μ μ΄λ»κ² λ μ§ λ³Έλ€.
0xA0000000 | 0xA0000001 | 0xA0000002 | 0xA0000003 | 0xA0000004 | 0xA0000005 |
---|---|---|---|---|---|
0x48 | 0x65 | 0x6C | 0x6C | 0x6F | 0x00 |
μ΄μ κ°μ΄ κ±°μ λ€ μμ κ²μ΄λ€. κ° μ«μλ€μ ASCII
νμμΌλ‘ μΈμ½λ© λ κ²μ΄λ©°(μμΈν λ€μ΄κ°λ©΄ λ€λ₯Έ μΈμ½λ© ννλ₯Ό μ΄λ€λ©΄ 1 byte
λ‘λ λΆμ‘±ν κ²½μ°λ μλ€), 맨 λ μ£Όμμ μλ κ°μ 0x00
μ΄ μλ κ²μ λ³Ό μ μλλ° μ΄κ²μ νν μ΄μΌκΈ°νλ NULL
λ¬Έμμ΄μ μλ―Ένλ€. μ΄κ² μλ€λ©΄ μ΄λκΉμ§κ° λ¬Έμμ΄μ λμΈμ§ μκΈ°κ° μ΄λ €μΈ κ²μ΄λ€.
char[]
ννκ° μ‘°κΈ νΉλ³νκ³ , short
, int
, long long
μ κ²½μ° κΈΈμ΄μ μ°¨μ΄λ§ μλ€. κ·Έλ¦¬κ³ λ¬Όλ‘ float
, double
λ μλλ° μ΄κ²μ IEEEμμ μ ν νΉλ³ν μ§μ
, κ°μ
λ₯Ό λλ νκΈ°νλ λ°©λ²μ΄ μμΌλ κ΄μ¬μμΌλ©΄ μΆκ°λ‘ μ°Ύμ보λλ‘ νμ. μ΄μ°λλ μ΄λ€ λͺ¨λλ 맨 μ λΉνΈ(MSB)λ₯Ό ν΅ν΄ λΆνΈλ₯Ό νμ ν μ μλ κ²μ 곡ν΅μ μ΄λ€.
bool isNegative(int v) {const unsigned int mask = 0x80000000U;return ((unsigned int) v & mask);}
μ λ΄μ©μ ννλ€ λ€λ€ μλ€κ³ μκ°νλ λ΄μ©μ΄λ€. νμ§λ§ μ΄λ¬ν μ±μ§λ€μ νμ©νλ κ²μ λλ€λ₯Έ λ¬Έμ μ΄λ€. μ°μ , μ΄λ° κΆκΈμ¦μ΄ μμ μ μλ€. νΉμ λ©λͺ¨λ¦¬ 곡κ°μ 1 byte
λ¨μλ‘ λ°μ μ¬μ©ν μ μλκ°? μλ₯Όλ€λ©΄, κ²½μ°μ λ°λΌ ASCII
λ₯Ό μ°λ 1 byte
μ‘°μ°¨λ μκΉμ΄ κ²½μ°κ° μμ μ μλ€. 5λΉνΈλ‘ ννμ΄ κ°λ₯ν λ¬Έμ μ΄λ§ μ¨λ€κ³ νμ λλ 5λΉνΈλ§ μ¬μ©ν΄μ λ¬Έμλ₯Ό λνλ΄λκ² μ΅μ μΌν
λ°, κ·Έλ¬λ©΄ μ΄λ¬ν λΉνΈλ¨μ μ‘°μμ΄ νμν κ²½μ°λ μ΄λ»κ² ν΄κ²°ν μ μμκΉ?
λΉνΈλ¨μ λμμ ꡬννκΈ°μ λ°λΌ μμ²λκ² λΉ λ₯Ό μλ μκ³ λ릴 μλ μλ€. μΌλ¨μ λλ¦° λ°©λ²μΌλ‘ λ¨Όμ μ°μ΅ν΄λ³΄κ³ , κ°μ’
λ‘μ§λ€μ λΉ¨λΌμ§λλ‘ μμ ν΄λ³΄μ. μ°μ , λ©λͺ¨λ¦¬ 곡κ°μ char[]
μ λμλλ€. μ€μ μ£Όμμ μ΅μ λ¨μκ° 1 byte
λ¨μμ΄κ³ , char
μ ν¬κΈ°λ 1 byte
μ΄λ μ²μμ°λΆμ΄λ€. μ΄ λ°°μ΄μ μ΄κΈ° μμ μ£Όμλ₯Ό μ¬μ©νκ³ μ νλ λ©λͺ¨λ¦¬μ μμ μ£ΌμλΌκ³ νμ. κ·Έλ¬λ©΄ n λΉνΈ λ€μ 곡κ°(n λ°μ΄νΈκ° μλμ μ μ)μ μ΄λ»κ² μ κ·Όν κ²μΈκ°? μλμ²λΌ ν μ μλ€.
bool getBit(char arr[], int bitpos) {return (arr[bitpos >> 3] & (bitpos & 0x7)) != 0;}
>> 3
μ / 8
κ³Ό λμΌν ν¨κ³Όμ΄λ©°, 0x7
μ % 8
κ³Ό λμΌν ν¨κ³Όμ΄λ€. μ λ‘μ§μ μμ£Ό μλ¦λ΅κ² λμνλ€. setBitλ μ μ¬νκ² κ΅¬νν μ μλ€.
bool setBit(char arr[], int bitpos) {return arr[bitpos >> 3] |= 1 << (bitpos & 0x7);}
κ·Έλ°λ°, μ΄λμΈμμ λΉνΈλ₯Ό νλμ© μΌκ³ μκ² λκ°? νΉνλ μ°λ¦¬λ μ±λ₯ μ΅μ νλ₯Ό νλ €κ³ μ΄λ° Low Level
μ λ°°μ°κ³ μλ κ²μ΄μ§ λΉνΈλ₯Ό νλμ© μΌκ³ λλ €κ³ λ°°μ°κ³ μλ κ²μ΄ μλλ€. μ΄λ€ λ©λͺ¨λ¦¬μμ κ°μ νλ²μ λ°κΏ λλ κ°λ₯νλ©΄ κ°μ₯ ν° λ¨μ λ‘ νλ κ²μ΄ μ’λ€. λ§μ½μ λ©λͺ¨λ¦¬μμ λΉνΈλ₯Ό 01010101...
μ κ°μ μμΌλ‘ μΈν
νκ³ μΆμΌλ©΄ μ΄λ€κ°? μλμ²λΌ νλ©΄ λλΉλ€.
for (int i = 0; i < MAX_POS; ++i) {if (i & 1) setBit(arr, i);}
μ μ½λλ μλνλλ‘ νλ¦Όμμ΄ λμν κ²μ΄μ§λ§, unsigned long long
μ΄λΌλ 64 bit
μλ£νμΌλ‘ 64λ°° λΉ λ₯΄κ² λ§λ€ μ μλ€. (μλ°νκ²λ λ°°μ΄ ν¬κΈ°κ° 컀μ§μ λ°λΌ L1 / L2 μΊμ λ±μ μκ°νλ©΄ 64λ°°κΉμ§λ μλ μ μκ² μ§λ§ μλ¬΄νΌ λΉ¨λΌμ§λ€)
unsigned long long mask = 0x5555555555555555ULL;unsigned long long *ullp = (unsigned long long*) arr;for(int i = 0; i < MAX_POS / 64; ++i) {ullp[i] = mask;}
0x5555...
λ 0101... μ΄ μ°μμ μΌλ‘ μλ κ²μ 16μ§μ ννμ΄λ€.
λ§μ½, μλμ κ°μ μΈ μ’
λ₯μ λΉνΈ μΈνΈλ₯Ό κ³μν΄μ write ν΄μΌνλ κ²½μ°λ₯Ό μκ°ν΄λ³΄μ. Huffman
μ½λ©κ³Ό κ°μ κ³³μμ μ¬μ©λλ caseμΌ μ μκ² λ€.
μ°κ³ μ νλ λ°μ΄ν°λ 01011100001011
κ³Ό κ°μ΄ λ κ²μ΄λ€. μλ³Έ λ°μ΄ν°λ int oData[]
μ μ μ₯λμ΄ μλ€κ³ νμ. Naiveνκ²λ μλμ²λΌ ꡬνλλ€.
int bitpos = 0;for (int i = 0; i < DATA_SIZE; ++i) {switch (oData[i]) {case 1:++bitPos;break;case 2:++bitPos;setBit(arr, bitPos++);break;case 3:setBit(arr, bitPos++);setBit(arr, bitPos++);break;}}
κ·Έλ°λ°, μ΄κ²μ LUTλ₯Ό νμ©ν΄μ λΆκΈ°μμ΄ μ²λ¦¬ν μ μλ€.
char* p = arr;int offset = 0;for (int i = 0; i < DATA_SIZE; ++i) {p |= LUT[offset][oData[i]];p += LUT_NEXT[offset][oData[i]];offset += LUT_SIZE[oData[i]];offset &= 0x7;}
μ¬κΈ°μ μ°μΌ μ μλ LUT ꡬνμ μ§μ ν΄λ³΄μ.