go sizeof 源码

  • 2022-07-15
  • 浏览 (862)

golang sizeof 代码

文件路径:/test/sizeof.go

// run

// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import "unsafe"

type T struct {
	X int
}

var t T

func isUintptr(uintptr) {}

type T2 struct {
	A int32
	U2
}

type U2 struct {
	B int32
	C int32
}

var t2 T2
var p2 *T2

func main() {
	// Test unsafe.Sizeof, unsafe.Alignof, and unsafe.Offsetof all return uintptr.
	isUintptr(unsafe.Sizeof(t))
	isUintptr(unsafe.Alignof(t))
	isUintptr(unsafe.Offsetof(t.X))

	// Test correctness of Offsetof with respect to embedded fields (issue 4909).
	if unsafe.Offsetof(t2.C) != 8 {
		println(unsafe.Offsetof(t2.C), "!= 8")
		panic("unsafe.Offsetof(t2.C) != 8")
	}
	if unsafe.Offsetof(p2.C) != 8 {
		println(unsafe.Offsetof(p2.C), "!= 8")
		panic("unsafe.Offsetof(p2.C) != 8")
	}
	if unsafe.Offsetof(t2.U2.C) != 4 {
		println(unsafe.Offsetof(t2.U2.C), "!= 4")
		panic("unsafe.Offsetof(t2.U2.C) != 4")
	}
	if unsafe.Offsetof(p2.U2.C) != 4 {
		println(unsafe.Offsetof(p2.U2.C), "!= 4")
		panic("unsafe.Offsetof(p2.U2.C) != 4")
	}
	testDeep()
	testNotEmbedded()
}

type (
	S1 struct {
		A int64
		S2
	}
	S2 struct {
		B int64
		S3
	}
	S3 struct {
		C int64
		S4
	}
	S4 struct {
		D int64
		S5
	}
	S5 struct {
		E int64
		S6
	}
	S6 struct {
		F int64
		S7
	}
	S7 struct {
		G int64
		S8
	}
	S8 struct {
		H int64
		*S1
	}
)

func testDeep() {
	var s1 S1
	switch {
	case unsafe.Offsetof(s1.A) != 0:
		panic("unsafe.Offsetof(s1.A) != 0")
	case unsafe.Offsetof(s1.B) != 8:
		panic("unsafe.Offsetof(s1.B) != 8")
	case unsafe.Offsetof(s1.C) != 16:
		panic("unsafe.Offsetof(s1.C) != 16")
	case unsafe.Offsetof(s1.D) != 24:
		panic("unsafe.Offsetof(s1.D) != 24")
	case unsafe.Offsetof(s1.E) != 32:
		panic("unsafe.Offsetof(s1.E) != 32")
	case unsafe.Offsetof(s1.F) != 40:
		panic("unsafe.Offsetof(s1.F) != 40")
	case unsafe.Offsetof(s1.G) != 48:
		panic("unsafe.Offsetof(s1.G) != 48")
	case unsafe.Offsetof(s1.H) != 56:
		panic("unsafe.Offsetof(s1.H) != 56")
	case unsafe.Offsetof(s1.S1) != 64:
		panic("unsafe.Offsetof(s1.S1) != 64")
	case unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8:
		panic("unsafe.Offsetof(s1.S1.S2.S3.S4.S5.S6.S7.S8.S1.S2) != 8")
	}
}

func testNotEmbedded() {
	type T2 struct {
		B int32
		C int32
	}
	type T1 struct {
		A int32
		T2
	}
	type T struct {
		Dummy int32
		F     T1
		P     *T1
	}

	var t T
	var p *T
	switch {
	case unsafe.Offsetof(t.F.B) != 4:
		panic("unsafe.Offsetof(t.F.B) != 4")
	case unsafe.Offsetof(t.F.C) != 8:
		panic("unsafe.Offsetof(t.F.C) != 8")

	case unsafe.Offsetof(t.P.B) != 4:
		panic("unsafe.Offsetof(t.P.B) != 4")
	case unsafe.Offsetof(t.P.C) != 8:
		panic("unsafe.Offsetof(t.P.C) != 8")

	case unsafe.Offsetof(p.F.B) != 4:
		panic("unsafe.Offsetof(p.F.B) != 4")
	case unsafe.Offsetof(p.F.C) != 8:
		panic("unsafe.Offsetof(p.F.C) != 8")

	case unsafe.Offsetof(p.P.B) != 4:
		panic("unsafe.Offsetof(p.P.B) != 4")
	case unsafe.Offsetof(p.P.C) != 8:
		panic("unsafe.Offsetof(p.P.C) != 8")
	}
}

相关信息

go 源码目录

相关文章

go 235 源码

go 64bit 源码

go alg 源码

go alias 源码

go alias1 源码

go alias2 源码

go alias3 源码

go align 源码

go append 源码

go append1 源码

0  赞