sizeof操作符是如何在c++;? 有人指出了C++中SIEZOF算子的实现,并对其实现进行了描述。

sizeof操作符是如何在c++;? 有人指出了C++中SIEZOF算子的实现,并对其实现进行了描述。,c++,sizeof,C++,Sizeof,sizeof是不能重载的运算符之一 这意味着我们不能改变它的默认行为? 基本上,引述如下: Sizeof不能重载,因为内置操作(例如将指针递增到数组中)隐式地依赖于它。考虑: 因此,sizeof(X)不能给出一个 新的和不同的含义 不违反基本指令的程序员 语言规则 代码> sieOS/不是C++中的实际运算符。它只是一种特殊的语法,插入一个等于参数大小的常量sizeof不需要或没有任何运行时支持 编辑:您想知道如何根据类/结构的定义确定其大小吗?这方面的规则是的一部分,编译器只是实现它们。基本上

sizeof是不能重载的运算符之一

这意味着我们不能改变它的默认行为?

基本上,引述如下:

Sizeof不能重载,因为内置操作(例如将指针递增到数组中)隐式地依赖于它。考虑:

因此,sizeof(X)不能给出一个 新的和不同的含义 不违反基本指令的程序员 语言规则


<>代码> sieOS/<代码>不是C++中的实际运算符。它只是一种特殊的语法,插入一个等于参数大小的常量
sizeof
不需要或没有任何运行时支持

编辑:您想知道如何根据类/结构的定义确定其大小吗?这方面的规则是的一部分,编译器只是实现它们。基本上,规则包括

  • 基本类型的大小和对齐定义
  • 各种指针的结构、大小和对齐方式
  • 结构中填充字段的规则
  • 关于虚拟表相关内容的规则(更深奥)
  • 但是,ABI是特定于平台的,通常是特定于供应商的,即在x86和(比如)IA64上,下面的
    A
    的大小将不同,因为IA64不允许未对齐的数据访问

    struct A
    {
        char i ;
        int  j ;
    } ;
    
    assert (sizeof (A) == 5)  ; // x86, MSVC #pragma pack(1)
    assert (sizeof (A) == 8)  ; // x86, MSVC default
    assert (sizeof (A) == 16) ; // IA64
    

    不,你不能改变它。您希望从它的实现中学到什么

    <>代码< >代码>不能用C++编写,使用更多的基本操作。它不是函数或库标题的一部分,例如
    printf
    malloc
    。它在编译器内部

    <>编辑:如果编译器本身是用C或C++编写的,那么你可以认为实现是这样的:

    size_t calculate_sizeof(expression_or_type)
    {
       if (is_type(expression_or_type))
       {
           if (is_array_type(expression_or_type))
           {
               return array_size(exprssoin_or_type) * 
                 calculate_sizeof(underlying_type_of_array(expression_or_type));
           }
           else
           {
               switch (expression_or_type)
               {
                    case int_type:
                    case unsigned_int_type:
                         return 4; //for example
                    case char_type:
                    case unsigned_char_type:
                    case signed_char_type:
                         return 1;
                    case pointer_type:
                         return 4; //for example
    
                    //etc., for all the built-in types
                    case class_or_struct_type:
                    {
                         int base_size = compiler_overhead(expression_or_type);
                         for (/*loop over each class member*/)
                         {
                              base_size += calculate_sizeof(class_member) +
                                  padding(class_member);
                         }
                         return round_up_to_multiple(base_size,
                                  alignment_of_type(expression_or_type));
                    }
                    case union_type:
                    {
                         int max_size = 0;
                         for (/*loop over each class member*/)
                         {
                              max_size = max(max_size, 
                                 calculate_sizeof(class_member));
                         }
                         return round_up_to_multiple(max_size,
                                alignment_of_type(expression_or_type));
                    }
               }
           }
       }
       else
       {
           return calculate_sizeof(type_of(expression_or_type));
       }
    }
    

    请注意,这是非常伪代码。有很多东西我没有包括在内,但这是总的想法。编译器可能实际上并没有这样做。它可能计算并存储类型(包括类)的大小,而不是每次编写
    sizeof(X)
    时重新计算。例如,它还允许根据指针指向的对象而使指针大小不同。

    sizeof执行编译时的操作。运算符重载只是函数,它们在运行时执行的操作。因此,即使C++标准允许,也不可能超载sixof。

    siZeof是编译时运算符,这意味着它在编译时被评估。
    它不能重载,因为它对所有用户定义的类型都有意义-sizeof()类是该类定义的对象在内存中的大小,而sizeof()是变量是变量名在内存中占用的对象的大小。

    请查看源代码以了解如何执行此操作。

    除非您需要了解如何计算特定于C++的大小(例如v表的分配),否则可以查看Plan9的C编译器。这比处理g++要简单得多。

    变量:

    #define getsize_var(x) ((char *)(&(x) + 1) - (char *)&(x))
    
    类型:



    它没有给出实现细节。确切的函数定义可能是更好的选择。sizeof不能是函数,因为它同时接受类型和值:比较sizeof(int)和sizeof(“123”)。但我想返回编译时常量的问题仍然存在。虽然它可以返回类似于template int_uu运算符sizeof(){…}的内容,但根据Tit的不同,I将是一个编译时常量,而我甚至不需要一个体。对于嵌套的静态int const value成员,这样的声明就足够了:p默认实现是template int_<::sizeof(T)>operator sizeof();(注意<和::之间的空格,为了避免有向图,在这种情况下,您有什么可能的用途?哇,想想您重载sizeof:-)我的目的只是研究sizeof运算符的内部实现。您有完整的GCC代码可用,如果你想勇敢面对……我不知道为什么人们一直对这个问题投反对票——它似乎已经引出了一些有趣的答案。那么它如何计算常量值,即变量的大小呢?Alien01,它不计算变量的大小。sizeof()在编译时解析(“执行”,如果愿意)。编译器将插入正确的值-它已经知道了。例如,在32位x86体系结构上,它将知道int是32位长的,指针是32位的,等等。Alien01:我添加了一个关于编译器如何计算结构大小的参考。在运行时,结构大小是固定且已知的,与编写
    inti=8时相同#define getsize_var(x) ((char *)(&(x) + 1) - (char *)&(x))
    
    #define getsize_type(type) ( (char*)((type*)(1) + 1) - (char*)((type *)(1)))