2016-08-21 5 views
9

Как и в том, что я узнал на C++, я считаю, что это дополнение, которое вызывает разницу в размерах экземпляров обеих структур.Оптимизация структуры данных/выравнивание слов в golang

type Foo struct { 
    w byte //1 byte 
    x byte //1 byte 
    y uint64 //8 bytes 
} 
type Bar struct { 
    x byte //1 byte 
    y uint64 //8 bytes 
    w byte// 1 byte 
} 
func main() { 
    fmt.Println(runtime.GOARCH) 
    newFoo := new(Foo) 
    fmt.Println(unsafe.Sizeof(*newFoo)) 
    newBar := new(Bar) 
    fmt.Println(unsafe.Sizeof(*newBar)) 
} 

Выход:

amd64 
16 
24 
  • Есть ли эмпирическое правило следовать при определении элементов этой структуры? (например, по возрастанию/убыванию порядка размеров)
  • Есть ли оптимизация времени компиляции, которую мы можем передать, что может автоматически позаботиться об этом?
  • Или я не должен беспокоиться об этом вообще?
+1

Я привел пример, что может обеспечить некоторое представление https://play.golang.org/p/dNWspo2Dxv – jpgerek

ответ

10

В настоящее время нет оптимизации времени компиляции; значения заполняются до 8 байтов на x64.

Вы можете вручную организовать структуры для оптимального использования пространства; обычно переходя от более крупных типов к меньшим; 8 последовательных байтовых полей, например, будет использовать только 8 байт, а один байт будет утепленные для выравнивания 8 байт, считают это: https://play.golang.org/p/0qsgpuAHHp

package main 

import (
    "fmt" 
    "unsafe" 
) 

type Compact struct { 
    a, b     uint64 
    c, d, e, f, g, h, i, j byte 
} 

// Larger memory footprint than "Compact" - but less fields! 
type Inefficient struct { 
    a uint64 
    b byte 
    c uint64 
    d byte 
} 

func main() { 
    newCompact := new(Compact) 
    fmt.Println(unsafe.Sizeof(*newCompact)) 
    newInefficient := new(Inefficient) 
    fmt.Println(unsafe.Sizeof(*newInefficient)) 
} 

Если принять это во внимание; вы можете оптимизировать объем памяти ваших структур.

+1

Я хотел бы также добавить, что вы можете визуализировать-структуру с помощью инструментов, таких как [StructLayout] (HTTPS : //github.com/dominikh/go-structlayout) и [aligncheck] (https://github.com/opennota/check), чтобы помочь вам оптимизировать структуру макетов. – Chewxy

8

Или я не должен беспокоиться об этом вообще?

Да, вы должны.
Это также называется mechanical sympathy (см. Это Go Time podcast episode), поэтому он также зависит от архитектуры оборудования, которую вы компилируете.

См в качестве иллюстрации:

Значения в срезах Go представляют собой 16-байтовый выровнены. Они не выровнены по 32 байт.
Указатели Go выровнены по байт.

Смежные вопросы