내가 생각하는 장점 중 하나 bzero()
이상이 memset()
제로에 메모리를 설정 만들어지고 실수의 감소 가능성이 있다는 것이다.
한 번 이상 다음과 같은 버그가 발생했습니다.
memset(someobject, size_of_object, 0); // clear object
컴파일러는 불만을 제기하지 않으며 (어쩌면 일부 컴파일러에서 경고 수준을 높이면 일부 메모리가 지워질 수 있음) 영향을받습니다. 이것은 객체를 휴지통에 버리지 않기 때문에 그냥 내버려두기 때문에 버그가 분명하게 나타나지 않을 가능성이 있습니다.
bzero()
표준이 아니라는 사실 은 사소한 자극입니다. (FWIW, 프로그램에서 대부분의 함수 호출이 표준이 아닌 경우 놀라지 않을 것입니다. 사실 그러한 함수를 작성하는 것이 일종의 일입니다).
또 다른 답변에 대한 언급에서 Aaron Newton은 Stevens 등의 1.2 절 (강조 추가)에 의해 Unix Network Programming, Volume 1, 3rd Edition에서 다음을 인용했습니다.
bzero
ANSI C 함수가 아닙니다. 초기 Berkely 네트워킹 코드에서 파생되었습니다. 그럼에도 불구하고, 우리는 ANSI C memset
함수 대신 텍스트 전체에서 그것을 사용합니다 . 왜냐하면 (세 bzero
개의 인수로)보다 memset
( 두 개의 인수로) 기억 하기 가 쉽기 때문 입니다 . 소켓 API를 지원하는 거의 모든 벤더는 또한을 제공 bzero
하며, 그렇지 않은 경우 unp.h
헤더에 매크로 정의를 제공합니다 .
실제로, TCPv3의 저자 [TCP / IP Illustrated, Volume 3-Stevens 1996]는 memset
첫 번째 인쇄에서 두 번째와 세 번째 인수를 10 번 으로 바꾸는 실수를 했습니다 . 두 인수가 모두 같은 유형이므로 AC 컴파일러는이 오류를 포착 할 수 없습니다. 실제로 두 번째 인수는 일반 int
적이고 세 번째 인수는 size_t
일반적으로 unsigned int
이지만 다른 유형의 인수에는 각각 0과 16으로 지정된 값을 memset
여전히 사용할 수 있습니다. 소켓 함수 중 일부는 실제로 인터넷 소켓 주소 구조의 마지막 8 바이트를 0으로 설정해야합니다. 그럼에도 불구하고 오류이며이를 사용하여 피할 수 있습니다
bzero
bzero
함수 프로토 타입을 사용하는 경우 두 인수를 서로 바꾸면 항상 C 컴파일러에서 잡을 수 있기 때문 입니다.
또한 대부분의 호출 memset()
은 메모리를 0으로 하는 것이라고 생각 하므로 해당 사용 사례에 맞는 API를 사용하지 않겠습니까?
가능한 단점 bzero()
은 컴파일러가 memcpy()
표준이기 때문에 최적화 할 가능성이 높기 때문에이를 인식하도록 작성 될 수 있다는 것입니다. 그러나 올바른 코드는 여전히 최적화 된 잘못된 코드보다 낫습니다. 대부분 bzero()
의 bzero()
경우을 사용 하면 프로그램 성능에 눈에 띄는 영향을 미치지 않으며으로 확장되는 매크로 또는 인라인 함수일 수 있습니다 memcpy()
.