Golang: 打包一个结构体

5
请考虑以下示例go代码:
package main

//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//
//
//void print_C_struct_size(){
//  struct Packed_Struct Packed_Struct;
//  struct UnPacked_Struct UnPacked_Struct;
//  printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
//  printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
//  return;
//}
//
import "C"



import(
    "fmt"
    "unsafe"
)

type GoStruct struct{
    A   uint16
    B   uint16
    C   uint32
    D   uint16
}


func main(){
    fmt.Println("Hello world!")
    meh := C.print_C_struct_size()
    var GoStruct GoStruct
    fmt.Printf("Sizeof GoStruct : %d\n", unsafe.Sizeof(GoStruct) ) 
    fmt.Printf("meh type: %T\n", meh)
}

输出结果为:
$ go run cgo.go 
Hello world!
Sizeof Packed_Struct: 10
Sizeof UnPacked_Struct: 12
Sizeof GoStruct : 12
meh type: main._Ctype_void

请注意,结构体打包后占用10个字节,否则为12个字节。默认情况下,在Go中尝试需要占用12个字节,如此处所示。

是否有一种Go式的方法来打包这个结构体,以便它仅使用10个字节?


2
这对你有帮助吗?https://medium.com/@liamkelly17/working-with-packed-c-structs-in-cgo-224a0a3b708b - hookenz
谢谢提供链接,内容非常丰富,但有些复杂。>< - struggling_learner
1个回答

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接