mirror of
https://github.com/chai2010/advanced-go-programming-book.git
synced 2025-05-23 20:02:22 +00:00
fix typo on ch3-04
This commit is contained in:
parent
2b3c4220b7
commit
906d0cc503
@ -110,9 +110,9 @@ func Foo(a bool, b int16) (c []byte)
|
||||
|
||||
函数的参数有不同的类型,而且返回值中含有更复杂的切片类型。我们该如何计算每个参数的位置和总的大小呢?
|
||||
|
||||
其实函数参数和返回值的大小以及对齐问题和结构体的大小和成员对齐问题是一致的,函数的第一个参数和第一个返回值会分别进行一次地址对齐。我们可以用诡代思路将全部的参数和返回值以同样的顺序分别放到两个结构体中,将FP伪寄存器作为唯一的一个指针参数,而每个成员的地址也就是对应原来参数的地址。
|
||||
其实函数参数和返回值的大小以及对齐问题和结构体的大小和成员对齐问题是一致的,函数的第一个参数和第一个返回值会分别进行一次地址对齐。我们可以用类比思路将全部的参数和返回值以同样的顺序分别放到两个结构体中,将FP伪寄存器作为唯一的一个指针参数,而每个成员的地址也就是对应原来参数的地址。
|
||||
|
||||
用这样的策略可以很容易计算前面的Foo函数的参数和返回值的地址和总大小。为了便于描述我们定义一个`Foo_args_and_returns`临时结构体类型用于诡代原始的参数和返回值:
|
||||
用这样的策略可以很容易计算前面的Foo函数的参数和返回值的地址和总大小。为了便于描述我们定义一个`Foo_args_and_returns`临时结构体类型用于类比原始的参数和返回值:
|
||||
|
||||
```go
|
||||
type Foo_args struct {
|
||||
@ -146,7 +146,7 @@ func Foo(FP *SomeFunc_args, FP_ret *SomeFunc_returns) {
|
||||
}
|
||||
```
|
||||
|
||||
代码完全和Foo函数参数的方式类似。唯一的差异是每个函数的偏移量,通过`unsafe.Offsetof`函数自动计算生成。因为Go结构体中的每个成员已经满足了对齐要求,因此采用通用方式得到每个参数的偏移量也是满足对齐要求的。序言注意的是第一个返回值地址需要重新对齐机器字大小的倍数。
|
||||
代码完全和Foo函数参数的方式类似。唯一的差异是每个函数的偏移量,通过`unsafe.Offsetof`函数自动计算生成。因为Go结构体中的每个成员已经满足了对齐要求,因此采用通用方式得到每个参数的偏移量也是满足对齐要求的。需要注意的是第一个返回值地址需要重新对齐机器字大小的倍数。
|
||||
|
||||
Foo函数的参数和返回值的大小和内存布局:
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user