【问题标题】:What is the return type of sizeof operator?sizeof 运算符的返回类型是什么?
【发布时间】:2013-11-21 02:53:07
【问题描述】:

sizeof 运算符的返回类型是什么? cppreference.com & msdn 说 sizeof 返回 size_t。它真的返回 size_t 吗? 我正在使用 VS2010 Professional,并针对 x64。

int main()
{
    int size   = sizeof(int);     // No warning
    int length = strlen("Expo");  //warning C4267: 'initializing' : conversion from 'size_t' to 'int', possible loss of data
    return 0;
}

我有这个问题是因为第一行没有发出任何警告,而第二行却发出了警告。即使我将其更改为 char 大小,我也不会收到任何警告。

【问题讨论】:

  • 怎么样decltype(sizeof(int))...
  • 它可能不是警告,因为 sizeof 的结果对于编译器是静态已知的;它是一个常数,所以不用担心像 strlen 那样被截断。
  • 请注意,更聪明的编译器(例如gcc)也会在编译时确定length,因此也不会针对该转换发出警告。
  • @AdamD.Rupee 字符名称[CHAR_MAX + 5];字符大小 = sizeof(name); -> size 设置为-124,编译器应该能找到这个吧?
  • @MarcGlisse,我知道整数提升。根据 Adam 的回复(“它是一个常量,因此无需担心像 strlen 那样被截断”),我编写了导致截断的代码,编译器似乎没有对此发出警告。

标签: c++ visual-studio-2010 sizeof


【解决方案1】:

size_t 是一些实现定义的无符号整数类型的别名。在与 C 相对的 C++ 中,可以将 sizeof 运算符应用于 VLA 数组,但不会评估 sizeof 运算符的操作数(在运行时)。它是一个常数。如果 sizeof 运算符的值可以适合 int 类型,则编译器不会发出警告。 在第二个示例中,std::strlen 在运行时被评估,因此它的结果不适合 int,因此编译器会发出警告。 您可以用自己的 constexpr 函数(一些递归函数)替换 std:;strlen 。在这种情况下,如果结果可以适合 int 我认为编译器不会发出警告。

【讨论】:

    【解决方案2】:

    sizeof 运算符用于获取类型或变量的大小(以字节为单位)。返回至少 16 位的无符号整数类型。它用于获得可移植性。

    这个警告是因为定义了 size_t 的无符号整数。

    【讨论】:

    • 实际类型为size_t
    【解决方案3】:

    C++11,§5.3.3 ¶6

    sizeofsizeof... 的结果是std::size_t 类型的常量。 [注:std::size_t 定义在 标准标题(18.2)。 ——尾注]

    您也可以快速检查:

    #include <iostream>
    #include <typeinfo>
    #include <cstdlib>
    
    int main()
    {
        std::cout<<(typeid(sizeof(int))==typeid(std::size_t))<<std::endl;
        return 0;
    }
    

    在我的机器上正确输出1

    正如 @Adam D. Ruppe 在评论中所说,编译器可能不会抱怨,因为它已经知道结果,它知道这种“转换”并不危险

    【讨论】:

    • +1 为您的最后一段,因为亚当的话确实是恕我直言的症结所在。如果没有 size_t 值的静态知识,编译器应该发出警告。
    • 字符名称[CHAR_MAX + 5];字符大小 = sizeof(name); -> 大小设置为 -124。我不认为这种情况正在发生“可能编译器不会抱怨,因为它已经知道结果,它知道这种“转换”并不危险”
    • 很难想象对sizeof 的调用在编译时是未知的。 @syam
    • @Yakk 这与应该在运行时发生的strlen 相反(即使它可以在编译时进行优化)。
    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    相关资源
    最近更新 更多