본문 바로가기

C

c++ object memory alignment

1l cache memory 등을 고려하여 코드를 짜야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <array>
class alignas(32) Cat // 메모리를 32byte의 배수로 만든다
{
public:
    void speak();
private:
    // 위치에 따라 class 크기가 다름
    // 가장 큰 변수의 배수에서 메모리 할당이 끝나야 한다
    // 따라서 24byte 나올 수 있음
    // char를 늘려도 더 올라감
    char c1;
    int i4a;
    double d8;
    
    int i4b;
    
 
};
 
Cat staticCat; // global variable(static 변수 역할)
 
int main()
{
    std::cout << sizeof(Cat) << std::endl// 16byte
    Cat stackCat; // stack에 생성
 
    Cat* heapCatPtr = new Cat(); // heapCatPtr이 stack에 생성
                                 // Cat의 객체는 heap에 생성
                                 // 8byte
    
    delete heapCatPtr;
    std::array<Cat, 100> cats;
    // 메모리 구조가 24,48,72,96,,, 이런 식으로 간다
    // 하지만 L1 cache는 보통 64bytes다
    // l1 cache 중간에 메모리가 끊길 수 있다.
    // False sharing 문제 생길 수 있음
 
 
    return 0;
}

 

 

'C' 카테고리의 다른 글

C++ class copy move constructor, instructor  (0) 2021.06.23
static function, static variable  (0) 2021.06.23
c++ copy elison, Retrun value optimization  (0) 2021.06.23
c++ lvalue rvalue zero copy  (0) 2021.06.23
c++ heap memory space  (0) 2021.06.22