source

왜 구조 자체보다는 구조의 첫 번째 요소의 주소를 사용하는가?

goodcode 2022. 7. 17. 00:27
반응형

왜 구조 자체보다는 구조의 첫 번째 요소의 주소를 사용하는가?

개발자가 구조 자체가 아니라 구조의 첫 번째 요소의 주소를 복사/비교/설정할 때 일관되게 사용하는 또 다른 코드 베이스를 발견했습니다.여기 간단한 예가 있습니다.

먼저 구조 유형이 있습니다.

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

반응형