안녕하세요, 고퍼 여러분! Golang을 사용하는 첫 해 동안 저는 필드의 순서가 있어야 한다고 계속 생각했고, 내가 왜 그것에 대해 귀찮게 해야 합니까? 글쎄, 그것은 단지 들판일 뿐이고 뭔가 잘못된 것일 수도 있습니다. 그렇죠? 대부분의 다른 초보자들처럼, 나는 그것이 귀찮게 할 가치가 없다고 생각했습니다. 즉, 구조체의 특정 필드를 특정 순서로 배치하는 것이 얼마나 중요합니까? 정말 좋은 일이네요!
필드 순서 지정은 처음에는 무시되는 측면 중 하나이지만 튜토리얼을 진행하면서 특히 Go가 포인터와 작동하는 방식에 대한 이해는 매우 중요한 것으로 이해됩니다. 실제로, 특히 대용량 데이터 세트나 메모리 사용량이 많은 작업을 작업할 때 애플리케이션 성능을 향상시키는 데 있어 중요한 것은 바로 이 순서입니다. 그 불행한 결함은 Go 필드 주문에서 왜 그렇게 중요한지 더 잘 이해함으로써 수정될 것입니다.
메모리에 배치되면 구조체는 연속적인 메모리 블록으로 표시되며, 여기서 모든 필드는 구조체의 정의에 따라 차례로 위치합니다. 이는 다소 단순해 보일 수 있지만 이러한 종류의 선형 구성은 특히 메모리 정렬 및 패딩과 같은 영역에서 상당히 중요한 효과를 발휘합니다.
메모리 정렬은 메모리에서 데이터를 배치하고 액세스하는 방법에 관한 것입니다. 일반적으로 CPUS는 정렬 경계라고 하는 메모리에서 데이터를 가져오는 위치에 대한 편향을 가질 수 있습니다. 예를 들어, 32비트 정수는 4번째 바이트 주소에서 배치되거나 가져와야 합니다. 구조체에 제대로 정렬되지 않은 필드가 있는 경우 페이지를 넘기면서 Go 컴파일러는 패딩 바이트를 추가할 수 있습니다. 이것은 꽤 낭비가 됩니다. 예를 들어 다음 구조체를 살펴보세요.
struct example{ a bool // 1 byte b int32 // 4bytes; c bool // 1byte d int64 //8 bytes }
정렬 규칙으로 인해 이 부적절한 구조체에서 Go 컴파일러는 다음 필드 중간에 하나 이상의 패딩 바이트를 추가할 수 있습니다.
a는 1바이트이지만 b는 4바이트 정렬을 원하므로 패딩이 3바이트 삽입됩니다.
b 길이는 4바이트
c 길이는 1바이트이지만 8바이트가 필요한 d를 정렬하려면 7asing이 있으므로 패딩이 도입됩니다.
d 길이는 8바이트입니다.
목재가 구조용 목재인 이유는 다리 때문에 크기가 여전히 24이지만 내용물은 14만 필요하지만 실제 내용물의 부피와 패딩의 부피를 살펴보세요. .
필드 순서 및 구조 찾기는 음수 마진 형태로 공간을 낭비하는 것을 방지하는 데 도움이 될 수 있습니다. 다른 말로 하면:
type Example struct { d int64 // 8 bytes b int32 // 4 bytes a bool // 1 byte c bool // 1 byte }
위의 최적화된 구조체에서:
d는 8바이트를 차지합니다.
b는 4바이트를 차지합니다.
a 및 c는 패딩이 필요 없이 각각 1바이트를 차지합니다.
이 구조는 이제 크기가 16바이트에 불과하며 이전의 24바이트 크기 구조보다 더 좋습니다.
일반적인 소규모 응용 프로그램을 고려할 때 응용 프로그램에서 사용하는 메모리 양은 후자와 다르지 않을 것입니다. 그러나 성능과 메모리 공간이 중요한 구성에서는 시스템 내장, 초고속 고주파 거래 애플리케이션 또는 엄청난 양의 데이터를 처리하기 위한 애플리케이션을 고려하면 이러한 충실한 제한이 빠르게 추가될 수 있습니다. 이는 많은 대형 배열이나 연결된 구조체 조각을 사용하여 구성하거나 작동할 때 더욱 분명해집니다. 구조의 용량이 몇 바이트만 높으면 편향이나 로드 유니온을 알아차리기가 쉽지 않습니다. 수백만 개의 인스턴스를 조금씩 처리해야 하는 저메모리 아키텍처가 대량 생산되면 이러한 중독된 과다한 낭비는 더 이상 전례가 없는 일이 아닙니다.
필드 정렬은 Golang 구조체 디자인의 관점에서 볼 때 좋을 뿐만 아니라 메모리 최적화에서도 중요한 역할을 합니다. Go가 구조체와 해당 픽셀에 대한 메모리 레이아웃을 수행하는 방식에 대한 이러한 측면을 이해하면 실제로 구조체를 보다 효과적으로 설계할 수 있습니다. 이러한 사소한 조정은 메모리를 많이 사용하는 응용 프로그램과 관련하여 상당한 성능 향상을 가져올 수 있습니다. 다음번에 Go에서 구조체를 정의할 기회가 오면 해당 필드를 주변에 쏟아 놓지 마세요. 대신 순서를 고려하는 데 1분만 투자하세요. 앞으로 며칠 내에 자신과 지원서에 대해 감사하게 될 것입니다!
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3