포인터를 전달하는 대신 C에서 값으로 구조체를 전달하는 데 단점이 있습니까?
구조체가 큰 경우 많은 양의 데이터를 복사하는 성능 측면이 분명히 있지만 작은 구조체의 경우 기본적으로 여러 값을 함수에 전달하는 것과 동일해야합니다.
반환 값으로 사용하면 더 재미있을 것입니다. C에는 함수의 단일 반환 값만 있지만 종종 여러 값이 필요합니다. 따라서 간단한 해결책은 구조체에 넣고 반환하는 것입니다.
이에 대한 이유가 있습니까?
내가 여기서 말하는 것에 대해 모든 사람에게 분명하지 않을 수 있으므로 간단한 예를 들어 보겠습니다.
C로 프로그래밍하는 경우 조만간 다음과 같은 함수 작성이 시작됩니다.
void examine_data(const char *ptr, size_t len)
{
...
}
char *p = ...;
size_t l = ...;
examine_data(p, l);
이것은 문제가되지 않습니다. 유일한 문제는 매개 변수의 순서에 따라 동료와 동의해야 모든 기능에서 동일한 규칙을 사용할 수 있다는 것입니다.
그러나 같은 종류의 정보를 반환하려는 경우 어떻게됩니까? 일반적으로 다음과 같은 것을 얻습니다.
char *get_data(size_t *len);
{
...
*len = ...datalen...;
return ...data...;
}
size_t len;
char *p = get_data(&len);
이것은 잘 작동하지만 훨씬 더 문제가 있습니다. 반환 값은이 구현에서는 그렇지 않은 것을 제외하고는 반환 값입니다. 위에서 get_data 함수가 len이 가리키는 것을 볼 수 없다는 것을 알 수있는 방법이 없습니다. 그리고 컴파일러가 실제로 그 포인터를 통해 값이 반환되는지 확인하는 것은 없습니다. 따라서 다음 달 누군가가 코드를 제대로 이해하지 않고 코드를 수정하면 (문서를 읽지 않았기 때문에) 다른 사람이 모르게 깨지거나 무작위로 충돌하기 시작합니다.
그래서 내가 제안하는 해결책은 간단한 구조체입니다.
struct blob { char *ptr; size_t len; }
예제는 다음과 같이 다시 작성할 수 있습니다.
void examine_data(const struct blob data)
{
... use data.tr and data.len ...
}
struct blob = { .ptr = ..., .len = ... };
examine_data(blob);
struct blob get_data(void);
{
...
return (struct blob){ .ptr = ...data..., .len = ...len... };
}
struct blob data = get_data();
어떤 이유로, 나는 대부분의 사람들이 본능적으로 exam_data가 struct blob에 대한 포인터를 갖도록 만들 것이라고 생각하지만 그 이유는 모르겠습니다. 여전히 포인터와 정수를 얻습니다. 그리고 get_data 경우 길이에 대한 입력 값이 없으며 반환 된 길이가 있어야하기 때문에 앞에서 설명한 방식으로 엉망이 될 수 없습니다.
gettimeofday
은 포인터를 대신 사용 하여 논리적으로 수행 해야하는 모든 시스템 인터페이스를 예로 들었습니다.
void examine data(const struct blob)
것은 틀립니다.