如何检索数据类型的大小?

时间:2011-03-17 07:19:16

标签: c++

a成为一个数组。那么a.size()sizeof(a)之间有什么区别?

6 个答案:

答案 0 :(得分:3)

.size()可以返回任何内容,具体取决于它的实现方式。

无论如何,.size() 通常会返回容器的大小,换句话说 - 容器所包含的元素数量。

sizeof运算符是集成运算符,它返回在堆栈上分配的字节数。例如

        char a[50];
        char* b = new char[50];
        cout << sizeof( a ) << '\n';
        cout << sizeof( b );

打印50(这是50 * sizeof( char ) = 50 * 1 = 50),第二行打印8 - 因为这是指针的大小(我的机器是x64 ,这就是为什么它是8,如果我有32位CPU,它将是4)。

cout << sizeof( *b );将打印1,因为*b取消引用指针并返回数组的第一个元素(它与sizeof( b[0] )相同,即sizeof( char )

换句话说,如果你想看到元素的数量,如果它是一个容器,当然它是否提供了这样的方法,你最好依赖.size()


其他例子:

class A
{
        int a;
        char b[100];
};

class B
{
        int a;
        char* b;
public:
        B()
        {
                b = new char[100];
        }
        ~B()
        {
                delete[] b;
        }
};
int main()
{
        cout << sizeof( A ) << '\n';
        cout << sizeof( B ) << '\n';
        B b;
        cout << sizeof( b ) << '\n';
        return 0;
}

第一个,在x64 plarform上,将打印104,因为我们有100*sizeof(char) + sizeof(int) (=4 )注意 104 mod 8 == 0,你会明白为什么);

第二个和第三个将打印相同。 但请注意,我们在这里有一致!在x64上,对齐方式为8B,因此sizeof( char * )给出8,sizeof( int )给出4,这使得12. BUT 12 mod 8 == 4,这是!= 0,所以由于对齐,sizeof( B )打印 16 (16 mod 8 == 0)。

所以,当你使用sizeof时,要非常小心..
希望有所帮助(:


关于列表的问题,请看一下:

        list< int > lint;
        list< char > lchar;
        cout << sizeof( lint ) << '\n';
        cout << lint.size() << '\n';
        cout << sizeof( lchar ) << '\n';
        lint.push_back( 10 );
        lint.push_back( 10 );
        cout << lint.size() << '\n';
        cout << sizeof( lint ) << '\n';

所有运营商sizeof都会打印相同的内容,具体取决于std::list的实施情况。但是第一个.size()将返回0,因为没有元素,第二个将返回2,因为我们在列表中有2个元素。

答案 1 :(得分:2)

sizeof(a)a使用的字节数,不包括任何动态分配的内存。这是一个编译时常量。您也可以将它与类型一起使用,sizeof(int)为您提供int中的字节数。

通常为容器类型定义

a.size(),并给出容器中当前元素的数量(而不是字节数)。这是一个运行时值,在您从容器中添加或删除对象时会发生更改。

答案 2 :(得分:0)

a.size()为您提供课堂特别的价值。例如字符串或列表的长度。这取决于一个类的类型和实现它的人。但通常size在列表中有意义。

如果您是初学程序员,则应该避免使用Sizeof。它被广泛用于C alloc内存中。它返回对象在内存中占用的空间大小。在C ++中,我们使用new来动态分配内存。这更容易。有关sizeof的更多信息:http://en.wikipedia.org/wiki/Sizeof

答案 3 :(得分:0)

不确定a.size(),但sizeof(a)返回长度,以字节为单位。如果您想要数组中的元素数,请将其除以每个元素的大小。例如:

int size = sizeof(myArray) / sizeof(*myArray);

答案 4 :(得分:0)

如果a是数组 -

int a[5] ; // Taking it as an array that can hold integers.

现在 -

a.size(); // Error. `a` is not a class type to use `.` operator on it. 

sizeof(a); // Correct. It returns 20 because 5*4 bytes.

答案 5 :(得分:0)

sizeof是一个一元运算符,以字节数返回数据类型的大小。

sizeof(std::array<int, 3>) == sizeof(int[3]) == 3 * sizeof(int)
class Foo
{
  int a, b;
};
sizeof(Foo) == sizeof(int) * 2

size()template<typename T, size_t S> std::array<T,S>返回数组中数字元素的方法。

std::array<int, 3> a = {1,2,3};
a.size() == 3;