[C++] 구조체와 클래스의 차이 ( struct / class )
구조체와 클래스의 차이 : 기본 접근 지정자 말고는 없음.
class는 기본적으로 `` private``
struct는 기본적으로 `` public``
생성한 객체의 위치는, 클래스냐 구조체냐가 결정하는게 아니라, new로 만들었느냐 그냥 선언했느냐가 결정.
```cpp
#include <stdio.h>
struct ST {
int a;
};
class CL {
public:
int a;
};
int main(void) {
struct ST s;
s.a = 1;
CL c;
c.a = 1;
printf("struct : %p\n", &s.a);
printf("class : %p\n", &c.a);
return 0;
}
```
```
struct : 0x7ffee9e09a50
class : 0x7ffee9e09a54
```
보다시피 둘 다 지역변수로 스택에 잡힌다.
`` new``를 사용하면?
```cpp
int main(void) {
struct ST* s = new ST();
s->a = 1;
CL* c = new CL();
c->a = 1;
printf("struct : %p\n", &s->a);
printf("class : %p\n", &c->a);
delete s;
delete c;
return 0;
}
```
```
struct : 0x5600f5770e70
class : 0x5600f5770e90
```
둘 다 힙에 잡힌다.
struct alignment 설정하기 : struct나 class나 둘 다 된다.
```c
__attribute__ ((aligned(1), packed)) // until GCC 4.0
#pragma pack(push, 1) // since GCC 4.0 / MS Visual C
#pragma pack(pop)
```
따라서 아래를 사용하는 편이 좋다.
멤버 함수를 정의하는 경우 크기에 영항을 미치는가? X
`` sizeof``해보면 알 수 있다. 멤버 함수는 객체의 크기에 영향을 미치지 않는다.
단, ``cpp virtual``로 선언된 멤버 함수가 있는 경우는 예외.
마찬가지로 `` static`` 변수를 선언하는 것도 크기에 영향을 미치지 않는다.
* `` static`` 변수 초기화는 전역 스코프에서 해야한다는 것 유의.
[C/C++] 비트 필드 구조체
https://dojang.io/mod/page/view.php?id=473
https://docs.microsoft.com/ko-kr/cpp/cpp/cpp-bit-fields?view=vs-2017
구조체 선언과 동시에 초기화
```cpp
PresentFlag는 enum
struct _radiotap_field_info {
uint8_t align;
uint8_t size;
}
static const struct _radiotap_field_info rtap_namespace_sizes[] = {
[PresentFlag::TSFT] = { .align = 8, .size = 8, },
[PresentFlag::FLAGS] = { .align = 1, .size = 1, },
[PresentFlag::RATE] = { .align = 1, .size = 1, },
[PresentFlag::CHANNEL] = { .align = 2, .size = 4, },
[PresentFlag::FHSS] = { .align = 2, .size = 2, },
[PresentFlag::DBM_ANTSIGNAL] = { .align = 1, .size = 1, },
[PresentFlag::DBM_ANTNOISE] = { .align = 1, .size = 1, },
[PresentFlag::LOCK_QUALITY] = { .align = 2, .size = 2, },
[PresentFlag::EXAMPLE] = { .size = 2, .align = 2, }, // 구조체 순서랑 안맞으면 에러.
// Error sorry, unimplemented: non-trivial designated initializers not supported
// 중간에 숫자 빠진거 있어도 같은 에러. 0부터 n까지 다 채워야 함.
};
```
'Languages & Frameworks > C C++' 카테고리의 다른 글
Effective C++ (0) | 2019.01.22 |
---|---|
[C++] operator overloading (0) | 2019.01.22 |
[C++] 다양한 mutex, lock 중 뭘 써야하나. (0) | 2018.09.13 |
[C++] 생성자에서 throw하면(exception) 객체가 없어질까? / thread는 start() 함수로? (0) | 2018.09.12 |
[C++] thread는 context가 필요하다. (0) | 2018.09.11 |