2015-07-19 24 views
5

Tôi có một cấu trúc, nói:Cách lấy kích thước của cấu trúc và nội dung của nó theo byte trong golang?

type ASDF struct { 
    A uint64 
    B uint64 
    C uint64 
    D uint64 
    E uint64 
    F string 
} 

tôi tạo ra một lát struct rằng: a := []ASDF{}

tôi làm các thao tác trên mà lát của struct (struct thêm/gỡ bỏ/cập nhật khác nhau về nội dung) ; làm thế nào tôi có thể nhận được tổng kích thước theo byte (đối với bộ nhớ) của slice và nội dung của nó? Có tích hợp để làm điều này hay tôi cần phải tự chạy một phép tính bằng cách sử dụng unsafe.Sizeof và sau đó len mỗi chuỗi?

+0

câu hỏi nhanh, không tái cấu trúc 'ASDF' kích thước cố định kể từ khi bạn khai báo tất cả các loại biến? Sau đó, bạn chỉ có thể nhân kích thước của con trỏ struct của 'ASDF' bởi' len (a) '? Vì bạn chỉ có thể chắp thêm phần tử có kích thước giống nhau vào slice? Hay tôi hiểu lầm cách thức hoạt động của slice? – Anzel

+0

Mặc dù vậy, sẽ có vấn đề với trường 'chuỗi'. –

Trả lời

6

Tổng kích thước của tất cả bộ nhớ, ngoại trừ bộ thu gom rác và chi phí khác. Ví dụ,

package main 

import (
    "fmt" 
    "unsafe" 
) 

type ASDF struct { 
    A uint64 
    B uint64 
    C uint64 
    D uint64 
    E uint64 
    F string 
} 

func (s *ASDF) size() int { 
    size := int(unsafe.Sizeof(*s)) 
    size += len(s.F) 
    return size 
} 

func sizeASDF(s []ASDF) int { 
    size := 0 
    s = s[:cap(s)] 
    size += cap(s) * int(unsafe.Sizeof(s)) 
    for i := range s { 
     size += (&s[i]).size() 
    } 
    return size 
} 

func main() { 
    a := []ASDF{} 

    b := ASDF{} 
    b.A = 1 
    b.B = 2 
    b.C = 3 
    b.D = 4 
    b.E = 5 
    b.F = "ASrtertetetetetetetDF" 
    fmt.Println((&b).size()) 
    a = append(a, b) 

    c := ASDF{} 
    c.A = 10 
    c.B = 20 
    c.C = 30 
    c.D = 40 
    c.E = 50 
    c.F = "ASetDF" 
    fmt.Println((&c).size()) 
    a = append(a, c) 

    fmt.Println(len(a)) 
    fmt.Println(cap(a)) 
    fmt.Println(sizeASDF(a)) 
} 

Output:

69 
54 
2 
2 
147 

http://play.golang.org/p/5z30vkyuNM

1

Tôi sợ phải nói rằng unsafe.Sizeof là cách để đến đây nếu bạn muốn nhận được bất kỳ kết quả nào cả. Kích thước trong bộ nhớ của một cấu trúc là không có gì bạn nên dựa vào. Lưu ý rằng ngay cả kết quả của unsafe.Sizeof không chính xác: Thời gian chạy có thể thêm tiêu đề vào dữ liệu mà bạn không thể quan sát để hỗ trợ thu thập rác.

Ví dụ cụ thể của bạn (tìm kích thước bộ nhớ cache) Tôi khuyên bạn nên sử dụng kích thước tĩnh hợp lý cho nhiều bộ xử lý. Trong hầu hết các trường hợp, việc tối ưu hóa vi mô như vậy sẽ không tự trả hết.

+0

Hàm ['len (...)' (http://golang.org/pkg/builtin/#len) chỉ hoạt động với các mảng, chuỗi, lát và kênh. Không có sự giúp đỡ nào với cấu trúc = ( – maerics

+0

@maerics Chỉ để hiểu rõ hơn về những gì bạn đang cố đạt được, bạn tin rằng thông tin này hữu ích cho việc gì? – fuz

+0

@FUZxxl: không có ý kiến, hãy hỏi OP =) Tôi chỉ bình luận từ phòng trưng bày đậu phộng – maerics

Các vấn đề liên quan