update tw

This commit is contained in:
chai2010
2015-12-18 10:53:03 +08:00
parent 510c741a6f
commit c66a96ee52
106 changed files with 864 additions and 864 deletions

View File

@@ -1,19 +1,19 @@
## 13.1. unsafe.Sizeof, Alignof 和 Offsetof
`unsafe.Sizeof` 函數返迴操作數在內存的字節大小, 可以是任意類型的達式, 但是不會對達式進行求值. `Sizeof` 是一個 uintptr 類型的常量達式, 因此返迴的結果可以用着數據的大小, 或者用作計算其他的常量.
`unsafe.Sizeof` 函數返迴操作數在內存的字節大小, 可以是任意類型的達式, 但是不會對達式進行求值. `Sizeof` 是一個 uintptr 類型的常量達式, 因此返迴的結果可以用着數據的大小, 或者用作計算其他的常量.
```Go
import "unsafe"
fmt.Println(unsafe.Sizeof(float64(0))) // "8"
```
`Sizeof` 隻返迴數據結構中固定的部分, 例如字符串中指鍼和字符串長度部分, 但是不包含字符串的內容. Go中非聚類型通常有一個固定的尺寸, 管不工具鏈的具體大小可能會有所不. 考慮到可移植性, 引用類型或包含引用類型的大小在32位平上是4個字節, 在64位平上是8個字節.
`Sizeof` 隻返迴數據結構中固定的部分, 例如字符串中指鍼和字符串長度部分, 但是不包含字符串的內容. Go中非聚類型通常有一個固定的尺寸, 管不工具鏈的具體大小可能會有所不. 考慮到可移植性, 引用類型或包含引用類型的大小在32位平上是4個字節, 在64位平上是8個字節.
計算機加載和保存數據時, 如果內存地址理地對齊的將會更有效率.
計算機加載和保存數據時, 如果內存地址理地對齊的將會更有效率.
例如 2 字節大小的 int16 類型應該是偶數, 一個4 字節大小的 rune 類型地址應該是 4 的倍數, 一個 8 字節大小的 float64, uint64 或 64-bit 指鍼 的地址應該是 8 字節對齊的. 但是對於再大的地址對齊倍數則是不需要的,
卽使是 complex128 等較大的數據類型.
由於這個因素,一個聚類型(結構體或數組)的大小至少是所有字段或元素大小的總和, 或者更大因可能存在空洞. 空洞是編譯器自動添加的沒有被使用的空間, 用於保證後麫每個字段或元素的地址相對於結構或數組的開始地址能夠理地對齊.
由於這個因素,一個聚類型(結構體或數組)的大小至少是所有字段或元素大小的總和, 或者更大因可能存在空洞. 空洞是編譯器自動添加的沒有被使用的空間, 用於保証後面每個字段或元素的地址相對於結構或數組的開始地址能夠理地對齊.
類型 | 大小
@@ -29,7 +29,7 @@ func | 1個機器字
chan | 1個機器字
interface | 2個機器字(type,value)
Go的語言規範沒有保一個字段的聲明順序和內存中的順序是一緻的, 所以理論上一個編譯器可以隨意地重新排列每個字段的內存佈侷, 隨着在寫作本書的時候編譯器還沒有這做. 下的三個結構體有着相的字段, 但是第一個比另外的兩個需要多 50% 的內存.
Go的語言規範沒有保一個字段的聲明順序和內存中的順序是一緻的, 所以理論上一個編譯器可以隨意地重新排列每個字段的內存佈侷, 隨着在寫作本書的時候編譯器還沒有這做. 下的三個結構體有着相的字段, 但是第一個比另外的兩個需要多 50% 的內存.
```Go
@@ -41,7 +41,7 @@ struct{ bool; int16; float64 } // 2 words 3words
雖然關於對齊算法的細節超齣了本書的範圍, 也不是每一個結構體都需要擔心這個問題, 不過有效的包裝可以使數據結構更加緊湊, 內存使用率和性能都可能受益.
`unsafe.Alignof` 函數返迴對應參數的類型需要對齊的倍數. 和 Sizeof 類似, Alignof 也是返迴一個常量達式, 對應一個常量. 通常情況下佈爾和數字類型需要對齊到它們本身的大小(最多8個字節), 其它的類型對齊到機器字大小.
`unsafe.Alignof` 函數返迴對應參數的類型需要對齊的倍數. 和 Sizeof 類似, Alignof 也是返迴一個常量達式, 對應一個常量. 通常情況下佈爾和數字類型需要對齊到它們本身的大小(最多8個字節), 其它的類型對齊到機器字大小.
`unsafe.Offsetof` 函數的參數必鬚是一個字段 `x.f`, 然後返迴 `f` 字段相對於 `x` 起始地址的偏移量, 包括可能的空洞.
@@ -57,7 +57,7 @@ var x struct {
The table below shows the results of applying the three unsafe functions to x itself and to each of its three fields:
顯示了應用三個函數對 x 和它的三個字段計算的結果:
顯示了應用三個函數對 x 和它的三個字段計算的結果:
![](../images/ch13-01.png)
@@ -80,6 +80,6 @@ Sizeof(x.b) = 2 Alignof(x.b) = 2 Offsetof(x.b) = 2
Sizeof(x.c) = 24 Alignof(x.c) = 8 Offsetof(x.c) = 8
```
雖然它們在不安全的 unsafe 包, 但是這幾個函數不是眞的不安全,
在需要優化內存空間時它們對於理解原生的內存佈侷很有幫助.
雖然它們在不安全的 unsafe 包, 但是這幾個函數不是眞的不安全,
在需要優化內存空間時它們對於理解原生的內存佈侷很有幫助.