让a
成为一个数组。那么a.size()
和sizeof(a)
之间有什么区别?
答案 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;