8

sizeofは実際の関数ではないようですか?

たとえば、次のように記述した場合:

int i=0;
printf("%d\n", sizeof(++i));
printf("%d\n", i);

次のような出力が得られる場合があります。

4
0

そして、アセンブルコードを掘り下げると、次のようなsthが見つかります。

movl     $4, %esi
leaq     LC0(%rip), %rdi
xorl %eax, %eax
call     _printf

したがって、コンパイラは、printf addのパラメータがそれを呼び出すときに、定数「4」を直接配置します。では、sizeofは何をするのでしょうか?

4

9 に答える 9

34

ご存知のとおり、標準ドキュメント(3.8MB PDF)があるのには理由があります。C99、セクション6.5.3.4、§2:

演算子は、オペランドのサイズ(バイト単位)を生成します。sizeofこれは、式または型の括弧で囲まれた名前の場合があります。サイズは、オペランドのタイプから決定されます。結果は整数です。オペランドの型が可変長配列型の場合、オペランドが評価されます。それ以外の場合、オペランドは評価されず、結果は整数定数になります。


ibreadのコメントに応えて、C99可変長配列の場合の例を次に示します。

#include <stdio.h>

size_t sizeof_int_vla(size_t count)
{
    int foo[count];
    return sizeof foo;
}

int main(void)
{
    printf("%u", (unsigned)sizeof_int_vla(3));
}

のサイズはfooコンパイル時に不明になり、実行時に決定する必要があります。生成されたアセンブリはかなり奇妙に見えるので、実装の詳細について私に聞かないでください...

于 2009-10-17T09:46:17.323 に答える
16

sizeofは演算子であり、関数ではありません。

通常、コンパイル時として評価されます。例外は、C99スタイルの可変長配列で使用される場合です。

あなたの例は評価sizeof(int)です。これはもちろんコンパイル時に知られているので、コードは定数に置き換えられ、++実行時に実行される存在しません。

int i=0;
cout << sizeof(++i) << endl;
cout << i << endl;

また、演算子であるため、値に角かっこを付けずに使用できることにも注意してください。

int myVal;
cout << sizeof myVal << endl;
cout << sizeof(myVal) << endl;

同等です。

于 2009-10-17T10:21:31.537 に答える
8

Sizeofは、渡された式を分析してその型を見つけます。次に、タイプのサイズを返します。

型のサイズはコンパイル時に常にわかっているため、定数としてマシンコードに入れられます。

于 2009-10-17T09:43:59.077 に答える
2

コンパイル時に定数(この場合は4)に置き換えられます。プラットフォームでintを保持するのに4バイトかかるためです。

そして、あなたのコードはあなたに出力を与える代わりにコンパイルされません;-)なぜならsizoef;-)

于 2009-10-17T09:44:59.857 に答える
1

C ++では、その中のsizeof()の型のサイズを計算し、コンパイル中に「関数呼び出し」全体を定数に置き換えます。sizeof()

内の式sizeof()は、プログラムの実行中に評価されることはありません。そして、それはタイプ名でさえないかもしれません。これらの例を確認してください。

struct X { int i; double j;};
int call_to_undefined_function();

sizeof(10/0);
sizeof( ((struct X*)NULL)->j );
sizeof( call_to_undefined_function() + 100 );
sizeof( call_to_undefined_function() + 100.0 );
sizeof( double() / int() );
于 2009-10-17T09:53:54.470 に答える
1

返される型のサイズはコンパイル時に計算され、実行時のオーバーヘッドはありません

于 2009-10-17T09:45:04.083 に答える
0

正確に言うと、「変数/定数/タイプなどのサイズ」という定数をコードに直接入れます。

于 2009-10-17T09:44:55.743 に答える
0

sizeof()は、引数として渡したサイズをバイト単位で返します。32ビットアーキテクチャでは、sizeof(int)は4を返し、sizeof(char)は1を返します。

于 2009-10-17T09:45:48.107 に答える
0

あなたは自分で言った:「sizeof」は関数ではありません。これは、特別な構文とセマンティクスを持つ組み込み演算子です (前の応答を参照してください)。関数ではないことをよりよく覚えておくために、次の例のように、余分な中括弧を使用する習慣を取り除き、「中括弧のない」 'sizeof' を式で使用することをお勧めします。

printf("%d\n", sizeof ++i);

これは元のバージョンとまったく同じです。

于 2009-10-17T15:18:47.000 に答える