>  기사  >  백엔드 개발  >  Go와 C의 데이터 구조 정렬 차이점

Go와 C의 데이터 구조 정렬 차이점

WBOY
WBOY앞으로
2024-02-09 15:51:091097검색

Go와 C의 데이터 구조 정렬 차이점

php 편집기 Xigua는 Go와 C의 데이터 구조 정렬의 차이점을 소개하기 위해 왔습니다. 프로그래밍 언어에서 데이터 구조 정렬은 메모리 액세스 효율성을 향상시키기 위해 수행되는 메모리 정렬 방법입니다. 하지만 Go와 C는 데이터 구조 정렬 측면에서 약간의 차이가 있습니다. C 언어에서는 정렬이 컴파일러 설정을 통해 제어되는 반면, Go 언어에서는 정렬이 컴파일러에 의해 자동으로 수행됩니다. 이러한 차이로 인해 C로 코드를 작성할 때 Go에서 메모리 액세스 오류가 발생할 수 있습니다. 따라서 개발자가 Go와 C의 데이터 구조 정렬 차이를 이해하는 것은 매우 중요합니다.

질문 내용

C 프로그램의 구조를 초기화하고 공유 메모리에 연결했습니다. 구조는 다음과 같습니다:

으아악

Golang으로 작성된 다른 프로그램의 구조를 읽으려고 합니다. C의 각 필드가 차지하는 바이트 수를 계산했고 Golang 구조체에 다음과 같은 동등한 필드가 있습니다.

으아악

구조체(DrvSHMTagStruct)의 크기는 C에서는 182416이고 Golang에서는 182412입니다(내 운영 체제는 ARM 기반입니다). 그렇다면 왜 그러한 차이가 있습니까? 그것들은 4바이트 다르며 흥미로운 점은 둘 다 오류 없이 동일한 구조에서 읽고 쓰면서 잘 작동한다는 것입니다.

분명히 검색해 보니 C 컴파일러가 컴파일 중에 데이터 구조 정렬을 한다는 것을 알게 되었습니다. 따라서 4바이트 차이가 발생합니다. 하지만 문제는 어떻게 Golang 프로그램이 공유 메모리에서 4바이트 차이가 나는 구조를 올바르게 읽을 수 있느냐는 것입니다.

또한 ARM 기반 Linux에서 프로그램을 실행하면 문제가 발생합니다. x64 Ubuntu에서는 크기가 동일합니다.

해결 방법

이것은 마지막 구성원 Instance 的填充。在你的 C 版本中,它用 7 个字节填充。在 Go 版本中,它用 3 填充。区别在于您在两个平台上执行 sizeof이 추가되었을 때 나타나는 4바이트입니다.

동일하게 만들려면 C 버전에서 #pragma pack(4) 或在 Go 版本中使用 #pragma pack(8)를 사용하거나(패킹을 지원하더라도 검색에서는 지원하지 않는 것으로 나타남) Go 구조체의 마지막 멤버로 필러를 추가할 수 있습니다.

으아악

위 내용은 Go와 C의 데이터 구조 정렬 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제