왜 구조 자체보다는 구조의 첫 번째 요소의 주소를 사용하는가?
개발자가 구조 자체가 아니라 구조의 첫 번째 요소의 주소를 복사/비교/설정할 때 일관되게 사용하는 또 다른 코드 베이스를 발견했습니다.여기 간단한 예가 있습니다.
먼저 구조 유형이 있습니다.
typedef struct {
int a;
int b;
} foo_t;
그런 다음 이러한 구조를 복사하는 기능이 있습니다.
void bar(foo_t *inp)
{
foo_t l;
...
memcpy(&l.a, &inp->a, sizeof(foo_t));
...
}
내가 직접 전화를 걸지는 않을 것이다.memcpy원래 개발자들이 단순히 C의 포인터와 구조를 잘 파악하지 못한 것이 아닌가 하는 의구심을 갖게 되었습니다.그러나 지금은 공통 개발자가 없는 두 개의 관련 없는 코드 베이스에서 이것을 보고 나 자신을 의심하기 시작했습니다.
왜 이런 스타일을 사용하려 할까요?
실제로 이에 대한 정당한 사용 사례가 하나 있습니다. 바로 클래스 계층을 구축하는 것입니다.
구조를 클래스 인스턴스로 처리할 때 첫 번째 멤버(즉, 오프셋 0)는 일반적으로 슈퍼타입 인스턴스입니다.슈퍼타입이 존재하는 경우.이를 통해 단순한 캐스팅이 서브타입과 슈퍼타입 사이를 이동할 수 있습니다.매우 편리합니다.
Darren Stone의 의도에 대한 노트에 따르면, 이것은 C언어로 OO를 실행할 때 예상됩니다.
어쨌든, 이 패턴을 피하고, 대신에 멤버에게 직접 액세스 하는 것을 추천합니다.
그 대신:
memcpy(&l.a, &inp->a, sizeof(foo_t));
다음과 같이 할 수 있습니다.
memcpy(&l, inp, sizeof(foo_t));
C가 첫 번째 구조체 멤버 앞에 패딩이 없음을 보증하기 때문에 위험하고 오해의 소지가 있을 수 있지만 두 문장은 실제로 여기서 같은 작업을 수행합니다.
그러나 가장 좋은 방법은 간단한 할당 연산자를 사용하여 구조 객체를 복사하는 것입니다.
l = *inp;
왜 이런 스타일을 사용하려 할까요?
내 추측으로는 무지하거나 규율이 나쁜 것 같아.
아무도 그러면 안 돼.구조 부재를 재배치하면 문제가 발생합니다.
이 코드는 안전하지 않습니다. 왜냐하면 구조체의 멤버를 재배치하면memcpy구성원의 경우 구조의 경계를 넘어 액세스a더 이상 첫 번째 멤버가 아닙니다
단, 구성원은 구조 내에서 의도적으로 명령되며 프로그래머는 구성원을 시작으로 구성원의 하위 집합만 복사하려고 할 수 있습니다.a건물 끝까지 달려가는 거야이 경우 다음과 같이 변경하여 코드를 안전하게 만들 수 있습니다.
memcpy(&l.a, &inp->a, sizeof(foo_t) - offsetof(foo_t, a));
구조 를 임의의 할 수 , 이 구조 부재는 임의의 순서로 재배치할 수 있습니다.memcpy절대 범위를 벗어나지 않습니다.
아무도 안 그럴 거야.한 적이 a그 전에 멤버를 삽입하거나 하면 메모리 파괴 버그가 발생합니다.
정말 나쁜 습관이에요.예를 들어 구조체에는 다른 멤버가 추가되어 있을 수 있습니다.이것은 미친 듯이 부주의한 습관이고 나는 누구나 이것을 할 것이라는 것을 읽고 놀랐다.
다른 사람들은 이미 이 점에 주목하고 있지만, 나를 괴롭히는 것은 다음과 같다.
struct Foo rgFoo [3];
struct Foo *pfoo = &rgFoo [0];
대신
struct Foo *pfoo = rgfoo;
인덱스로 어레이의 참조를 해제하고 주소를 다시 취득하는 이유는 무엇입니까?이미 주소입니다. 유일한 차이점은 pfoo가 기술적으로
struct Foo *const,
것은 아니다.
struct Foo *.
하지만 나는 항상 첫 번째 것을 보곤 했다.
언급URL : https://stackoverflow.com/questions/19776731/why-use-address-of-first-element-of-struct-rather-than-struct-itself
'source' 카테고리의 다른 글
| 음, 당신은 PRIU64가 누군가요? (0) | 2022.07.17 |
|---|---|
| Android 부동 동작 버튼 색상 변경 (0) | 2022.07.17 |
| Vuex 및 타이프스크립트를 사용하는 올바른 방법은 무엇입니까? (0) | 2022.07.17 |
| vue.js 템플릿에 외부 스크립트 포함 (0) | 2022.07.17 |
| Nuxt js 프로젝트의 config stylelint 파일 (0) | 2022.07.17 |