27

sizeof演算子を実装してみました。私はこのようにしました:

#define my_sizeof(x) ((&x + 1) - &x)

しかし、どちらのデータ型でも結果は常に「1」になります。

それから私はそれをグーグルで検索しました、そして私は次のコードを見つけました:

#define my_size(x) ((char *)(&x + 1) - (char *)&x)

そして、タイプキャストされている場合、コードは機能しています。理由はわかりません。このコードは、構造を完全に追加しています。

それはまたのために働いています:

#define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x)

タイプキャストされた場合、それがどのように機能するかを誰かが説明できますか?

4

10 に答える 10

31

ポインタ減算の結果は、バイトではなく要素になります。したがって、最初の式は1定義によりに評価されます。

これはさておき、マクロではかっこを使用する必要があります。

#define my_sizeof(x) ((&x + 1) - &x)
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)

そうしないとmy_sizeof()、式で使用しようとするとエラーが発生する可能性があります。

于 2013-01-05T11:04:59.877 に答える
8

sizeof演算子はC(およびC ++)言語仕様の一部であり、コンパイラー(フロントエンド)内に実装されます。他のC構造で実装する方法はありません(typeofなどのGCC拡張機能を使用しない限り)。副作用を発生させることなく、型または式のいずれかをオペランドとして受け入れることができるためです(たとえば、マクロがクラッシュするsizeof((i>1)?i:(1/i))場合はクラッシュしません)。ゼロによる除算)。Cコーディングガイドラインおよびウィキペディアも参照してください。i==0my_sizeof

Cポインタ演算を理解する必要があります。たとえば、この質問を参照してください。ポインタの違いは、バイトではなく要素で表されます。

于 2013-01-05T11:05:29.647 に答える
8
#define my_sizeof(x) ((char *)(&x + 1) - (char *)&x)

このmy_sizeof()マクロは、次の場合には機能しません。

  1. sizeof 1-4バイト(4バイトのプラットフォームの場合int
    my_sizeof(1)-まったくコンパイルされません。

  2. sizeof (int)-4バイト(4バイトのプラットフォームの場合int
    my_sizeof(int)-コードをまったくコンパイルしません。

変数に対してのみ機能します。、などのデータ型、、、、などintのリテラル、またはやのような右辺値式では機能しません。floatchar23.4'A'a+bfoo()

于 2016-02-03T14:29:56.067 に答える
7
#define my_sizeof(x) ((&x + 1) - &x)

&xプログラムで宣言された変数(たとえばdouble x)のアドレスを示し、それを1でインクリメントすると、タイプxの次の変数を格納できるアドレスが得られます(ここaddr_of(x) + 8では、doubleのサイズは8バイトです)。

この違いにより、xその量のメモリに格納できるタイプの変数の数が得られます。これは、タイプxの場合は明らかに1になります(1でインクリメントし、差を取るために行ったことです)。

#define my_size(x) ((char *)(&x + 1) - (char *)&x)

typecasting it into char* and taking the difference will tell us how many variables of type char can be stored in the given memory space (the difference). Since each char requires only 1 Byte of memory therefore (amount of memory)/1 will give the number of bytes between two successive memory locations of the type of variable passed on to the macro and hence the amount of memory that the variable of type x requires.

But you won't be able to pass any literal to this macro and know their size.

于 2016-05-04T05:47:17.430 に答える
6

しかし、どちらのデータ型でも結果は常に「1」になります。

はい、それがポインタ演算の仕組みです。これは、ポイントされているタイプの単位で機能します。char *だから、あなたが望むものであるの作品単位にキャストしcharます。

于 2013-01-05T11:04:57.643 に答える
2

This will work for both literals and variables.

#define my_sizeof(x) (char*) (&(((__typeof__(x) *)0)[1])) - (char *)(&(((__typeof__(x) *)0)[0]))
于 2020-08-09T07:19:08.810 に答える
0

I searched this yesterday, and I found this macro:

#define mysizeof(X)  ((X*)0+1)

Which expands X only once (no error as double evaluation of expression like x++), and it works fine until now.

于 2018-06-26T14:21:26.583 に答える
0
#define my_sizeof(x) ((&x + 1) - &x)
  • This is basically (difference of two memory values) / (size of the data type).

  • It gives you the number in which how many number of elements of type x can be stored. And that is 1. You can fit one full x element in this memory space.

  • When we typecast it to some other datatype, it represents how many number of elements of that datatype can be stored in this memory space.

#define my_size(x) ((char *)(&x + 1) - (char *)&x)
  • Typecasting it to (char *) gives you the exact number of bytes of memory because char is of one byte.
#define my_sizeof(x) (unsigned int)(&x + 1) - (unsigned int)(&x)
  • It will give you compilation error as you are typecasting a pointer type to int.
于 2021-11-14T17:51:56.797 に答える
-1

#my_sizeof(x)を定義する((&x + 1)-&x)

&xは変数のアドレスを示し、それを1(&x + 1)でインクリメントすると、タイプxの別の変数を格納できるアドレスが得られます。ここで、((&x + 1)-&x)のようにこれらのアドレスに対して算術演算を行うと、((&x + 1)-&x)アドレス範囲内にタイプxの1つの変数を格納できることがわかります。

ここで、その量のメモリを(char *)で型キャストすると[charのサイズは1バイトであり、char *をインクリメントすると1バイトのみで移動するため]、タイプxが消費しているバイト数を取得します。

于 2015-10-24T08:28:29.210 に答える
-1
#include<bits/stdc++.h>

using namespace std;
//#define mySizeOf(T) (char*)(&T + 1) - (char*)(&T)

        template<class T>
size_t mySizeOf(T)
{
        T temp1;
        return (char*)(&temp1 + 1) - (char*)(&temp1);
}
int main()
{
        int num = 5;
        long numl = 10;
        long long numll = 100;
        unsigned int num_un_sz = 500;

        cout<<"size of int="<<mySizeOf(num) << endl;
        cout<<"size of long="<<mySizeOf(numl) << endl;
        cout<<"size of long long ="<<mySizeOf(numll) << endl;
        cout<<"size of unsigned int="<<mySizeOf(num_un_sz) << endl;
        return 0;
}
于 2019-03-13T21:11:42.967 に答える