>  기사  >  백엔드 개발  >  Golang Field 주문이 중요합니까?

Golang Field 주문이 중요합니까?

WBOY
WBOY원래의
2024-09-07 20:30:32691검색

안녕하세요, 고퍼 여러분! Golang을 사용하는 첫 해 동안 저는 필드의 순서가 있어야 한다고 계속 생각했고, 내가 왜 그것에 대해 귀찮게 해야 합니까? 글쎄, 그것은 단지 들판일 뿐이고 뭔가 잘못된 것일 수도 있습니다. 그렇죠? 대부분의 다른 초보자들처럼, 나는 그것이 귀찮게 할 가치가 없다고 생각했습니다. 즉, 구조체의 특정 필드를 특정 순서로 배치하는 것이 얼마나 중요합니까? 정말 대단하네요!

필드 순서는 처음에는 무시되는 측면 중 하나이지만 튜토리얼을 진행하면서 특히 Go가 포인터와 함께 작동하는 방식에 대한 이해는 매우 중요한 것으로 이해됩니다. 실제로, 특히 대용량 데이터 세트나 메모리 사용량이 많은 작업을 작업할 때 애플리케이션 성능을 향상시키는 데 있어 중요한 것은 바로 이 순서입니다. 그 불행한 결함은 바둑 주문에서 왜 그렇게 중요한지 더 잘 이해함으로써 고쳐질 것입니다.

Go는 메모리에 구조체를 어떻게 저장하나요?

메모리에 배치되면 구조체는 연속 메모리 블록으로 표시되며, 여기서 모든 필드는 구조체 정의에 따라 차례로 위치합니다. 이는 다소 단순해 보일 수 있지만 이러한 종류의 선형 구성은 특히 메모리 정렬 및 패딩과 같은 영역에서 상당히 중요한 효과를 발휘합니다.

메모리 정렬 및 패딩

메모리 정렬은 메모리에서 데이터를 배치하고 액세스하는 방법에 관한 것입니다. 일반적으로 CPUS는 정렬 경계라고 하는 메모리에서 데이터를 가져오는 위치에 대한 편향을 가질 수 있습니다. 예를 들어, 32비트 정수는 4번째 바이트 주소에서 배치되거나 가져와야 합니다. 구조체에 제대로 정렬되지 않은 필드가 있는 경우 페이지를 넘기면서 Go 컴파일러는 패딩 바이트를 추가할 수 있습니다. 이것은 꽤 낭비가 됩니다. 예를 들어 다음 구조체를 살펴보세요.

struct example{

a bool   // 1 byte

b int32 // 4bytes;

c bool   // 1byte 

d int64 //8 bytes
}

Golang Field ordering matters?

정렬 규칙으로 인해 이 부적절한 구조체에서 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

}

Golang Field ordering matters?

위의 최적화된 구조체에서:

  • d는 8바이트를 차지합니다.

  • b는 4바이트를 차지합니다.

  • a와 c는 패딩 없이 각각 1바이트를 차지합니다.

이 구조는 이제 크기가 16바이트에 불과하며 이전의 24바이트 크기 구조보다 더 좋습니다.

이것이 중요한 이유

일반적인 소규모 애플리케이션을 고려할 때 애플리케이션에서 사용하는 메모리 양은 후자와 다르지 않을 것입니다. 그러나 성능과 메모리 공간이 중요한 구성에서는 시스템 내장, 초고속 고주파 거래 응용 프로그램 또는 엄청난 양의 데이터를 처리하는 응용 프로그램을 고려하면 이러한 충실한 제한이 빠르게 추가될 수 있습니다. 이는 많은 대형 배열이나 연결된 구조체 조각을 사용하여 구성하거나 작동할 때 더욱 분명해집니다. 구조의 용량이 몇 바이트만 높으면 편향이나 로드 유니온을 알아차리기가 쉽지 않습니다. 수백만 개의 인스턴스를 조금씩 처리해야 하는 저메모리 아키텍처가 대량 생산되면 이러한 중독성 있는 낭비는 더 이상 전례가 없는 일이 아닙니다.

結論

排序欄位不僅從 Golang 結構設計的角度來看很好,而且在記憶體最佳化中也發揮著重要作用。了解 Go 如何為結構及其像素進行記憶體佈局的這一方面可以在實踐中實現更有效的結構設計。當涉及大量使用記憶體的應用程式時,這種微不足道的調整可​​能會帶來相當大的效能提升。當您下次有機會在 Go 中定義結構體時,不要只是將這些欄位溢出。相反,花一分鐘考慮一下順序 - 在未來的日子裡你會感謝你自己和你的申請!

위 내용은 Golang Field 주문이 중요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.