3

私は、ポインターではなく配列とインデックスを使用することにより、「メモリアロケーター」タイプのコードです。配列のインデックスのサイズがポインターよりも小さいことを願っています。「ポインター」を64ビットポインターではなく整数インデックスとして配列に格納しているため、気になります。

配列が何によってインデックス付けされているかを示す Go 仕様には何も表示されません。明らかに、それはある種の整数です。非常に大きな値を渡すと、負の数を渡すことができないとランタイムが不平を言うので、どういうわけか符号付き整数にキャストされていると推測しています。それで、それはint32ですか?int64一番上のビットに触れていないので、そうではないと推測しています(これは、負の数に対する2の賛辞でした)。

4

3 に答える 3

4

Arrays may be indexed by any integer type.

The Array types section of the Go Programming Language Specification says that in an array type definition,

The length is part of the array's type and must be a constant expression that evaluates to a non-negative integer value.

In an index expression such as a[x]:

x must be an integer value and 0 <= x < len(a)

But there is a limitation on the magnitude of an index; the description of Length and capacity says:

The built-in functions len and cap take arguments of various types and return a result of type int. The implementation guarantees that the result always fits into an int.

So the declared size of an array, or the index in an index expression, can be of any integer type (int, uint, uintptr, int8, int16, int32, int64, uint8, uint16, uint32, uint64), but it must be non-negative and within the range of type int (which is the same size as either int32 or int64 -- though it's a distinct type from either).

于 2012-07-03T21:01:53.433 に答える
2

それは確かに非常に興味深い質問です。ドキュメントにも直接的なルールは見つかりませんでした。代わりに、グループで 2 つの優れたディスカッションを見つけました。

最初のものでは、多くのことの中で、インデックスがint-として実装されているのに では実装されていない理由を見つけましたuint

アルゴリズムは、負のオフセットなどを表現する機能から恩恵を受けることができます。インデックスが署名されていない場合、これらの場合は常に変換が必要になります。

2番目のものint64は、大きな配列に使用する可能性(ただし可能性のみ!)について具体的に述べており、lenおよびcap関数の制限について言及しています(実際にはドキュメントで言及されている制限):

組み込み関数 len と cap は、さまざまな型の引数を取り、int 型の結果を返します。実装は、結果が常に int に収まることを保証します。

しかし、それ以上の... 公式の見解が害を及ぼさないことに同意します. )

于 2012-07-03T20:56:23.297 に答える
1

配列とスライスはintsでインデックス付けされます。Anintは、32ビットまたは64ビットの符号付き整数として定義されます。最も一般的な実装(6g)は、現時点でのアーキテクチャに関係なく、32ビット整数を使用します。ただし、最終的にintは64ビットマシンでは64ビットになるため、ポインタと同じ長さになる予定です。

言語仕様では、実装に依存する3つの数値タイプが定義されています。

uint     either 32 or 64 bits
int      same size as uint
uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value
于 2012-07-03T20:47:05.707 に答える