mirror of
https://github.com/golang/go
synced 2024-11-22 01:24:42 -07:00
Added section on package unsafe:
- contains a (proposed) constant Maxalign - contains some text re" alignment guarantees R=ken,r DELTA=97 (94 added, 1 deleted, 2 changed) OCL=24791 CL=24871
This commit is contained in:
parent
0c4010a747
commit
52c02c2d5d
@ -3,7 +3,7 @@ The Go Programming Language Specification (DRAFT)
|
|||||||
|
|
||||||
Robert Griesemer, Rob Pike, Ken Thompson
|
Robert Griesemer, Rob Pike, Ken Thompson
|
||||||
|
|
||||||
(February 6, 2009)
|
(February 11, 2009)
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -254,6 +254,10 @@ Contents
|
|||||||
|
|
||||||
Program initialization and execution
|
Program initialization and execution
|
||||||
|
|
||||||
|
Systems considerations
|
||||||
|
Package unsafe
|
||||||
|
Size and alignment guarantees
|
||||||
|
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@ -753,7 +757,7 @@ The following identifiers are predeclared:
|
|||||||
All basic types:
|
All basic types:
|
||||||
|
|
||||||
bool, byte, uint8, uint16, uint32, uint64, int8, int16, int32, int64,
|
bool, byte, uint8, uint16, uint32, uint64, int8, int16, int32, int64,
|
||||||
float32, float64, float80, string
|
float32, float64, string
|
||||||
|
|
||||||
A set of platform-specific convenience types:
|
A set of platform-specific convenience types:
|
||||||
|
|
||||||
@ -1102,7 +1106,6 @@ The following list enumerates all platform-independent numeric types:
|
|||||||
|
|
||||||
float32 the set of all valid IEEE-754 32-bit floating point numbers
|
float32 the set of all valid IEEE-754 32-bit floating point numbers
|
||||||
float64 the set of all valid IEEE-754 64-bit floating point numbers
|
float64 the set of all valid IEEE-754 64-bit floating point numbers
|
||||||
float80 the set of all valid IEEE-754 80-bit floating point numbers
|
|
||||||
|
|
||||||
Integer types are represented in the usual binary format; the value of
|
Integer types are represented in the usual binary format; the value of
|
||||||
an n-bit integer is n bits wide. A negative signed integer is represented
|
an n-bit integer is n bits wide. A negative signed integer is represented
|
||||||
@ -3453,3 +3456,93 @@ Program execution begins by initializing the main package and then
|
|||||||
invoking main.main().
|
invoking main.main().
|
||||||
|
|
||||||
When main.main() returns, the program exits.
|
When main.main() returns, the program exits.
|
||||||
|
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
Systems considerations
|
||||||
|
----
|
||||||
|
|
||||||
|
Package unsafe
|
||||||
|
----
|
||||||
|
|
||||||
|
The special package "unsafe", known to the compiler, provides facilities
|
||||||
|
for low-level programming including operations that violate the Go type
|
||||||
|
system. A package using "unsafe" must be vetted manually for type safety.
|
||||||
|
|
||||||
|
The package "unsafe" provides (at least) the following package interface:
|
||||||
|
|
||||||
|
package unsafe
|
||||||
|
|
||||||
|
const Maxalign
|
||||||
|
|
||||||
|
type Pointer *any
|
||||||
|
|
||||||
|
func Alignof(variable any) int
|
||||||
|
func Offsetof(selector any) int
|
||||||
|
func Sizeof(variable any) int
|
||||||
|
|
||||||
|
The pseudo type "any" stands for any Go type; "any" is not a type generally
|
||||||
|
available in Go programs.
|
||||||
|
|
||||||
|
Any pointer type as well as values of type "uintptr" can be converted into
|
||||||
|
an "unsafe.Pointer" and vice versa.
|
||||||
|
|
||||||
|
The function "Sizeof" takes an expression denoting a variable of any type
|
||||||
|
and returns the size of the variable in bytes.
|
||||||
|
|
||||||
|
The function "Offsetof" takes a selector (§Selectors) denoting a struct
|
||||||
|
field of any type and returns the field offset in bytes relative to the
|
||||||
|
struct address. Specifically, the following condition is satisfied for
|
||||||
|
a struct "s" with field "f":
|
||||||
|
|
||||||
|
uintptr(unsafe.Pointer(&s)) + uintptr(unsafe.Offsetof(s.f)) ==
|
||||||
|
uintptr(unsafe.Pointer(&s.f))
|
||||||
|
|
||||||
|
Computer architectures may impose restrictions on the memory addresses accessed
|
||||||
|
directly by machine instructions. A common such restriction is the requirement
|
||||||
|
for such addresses to be ``aligned''; that is, addresses must be a multiple
|
||||||
|
of a factor, the ``alignment''. The alignment depends on the type of datum
|
||||||
|
accessed.
|
||||||
|
|
||||||
|
The function "Alignof" takes an expression denoting a variable of any type
|
||||||
|
and returns the alignment of the variable in bytes. The following alignment
|
||||||
|
condition is satisfied for a variable "x":
|
||||||
|
|
||||||
|
uintptr(unsafe.Pointer(&x)) % uintptr(unsafe.Alignof(x)) == 0
|
||||||
|
|
||||||
|
The maximum alignment is given by the constant "unsafe.Maxalign".
|
||||||
|
It usually corresponds to the value of "unsafe.Sizeof(x)" for
|
||||||
|
a variable "x" of the largest arithmetic type (8 for a float64), but may
|
||||||
|
be smaller on systems that have less stringent alignment restrictions
|
||||||
|
or are space constrained.
|
||||||
|
|
||||||
|
|
||||||
|
Size and alignment guarantees
|
||||||
|
----
|
||||||
|
|
||||||
|
For the arithmetic types (§Arithmetic types), a Go compiler guarantees the
|
||||||
|
following sizes:
|
||||||
|
|
||||||
|
type size in bytes
|
||||||
|
|
||||||
|
byte, uint8, int8 1
|
||||||
|
uint16, int16 2
|
||||||
|
uint32, int32, float32 4
|
||||||
|
uint64, int64, float64 8
|
||||||
|
|
||||||
|
A Go compiler guarantees the following minimal alignment properties:
|
||||||
|
|
||||||
|
1) For a variable "x" of any type: "1 <= unsafe.Alignof(x) <= unsafe.Maxalign".
|
||||||
|
|
||||||
|
2) For a variable "x" of arithmetic type: "unsafe.Alignof(x)" is the smaller
|
||||||
|
of "unsafe.Sizeof(x)" and "unsafe.Maxalign", but at least 1.
|
||||||
|
|
||||||
|
3) For a variable "x" of struct type: "unsafe.Alignof(x)" is the largest of
|
||||||
|
all the values "unsafe.Alignof(x.f)" for each field "f" of x, but at least 1.
|
||||||
|
|
||||||
|
4) For a variable "x" of array type: "unsafe.Alignof(x)" is the same as
|
||||||
|
unsafe.Alignof(x[0]), but at least 1.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user