[英]How to retrieve size of a data type?
设a
为数组。 那么a.size()
和sizeof(a)
什么区别?
.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 ,这就是为什么如果我有32位CPU的原因是8 ,那就是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平台上将打印104,因为我们有100*sizeof(char) + sizeof(int) (=4 )
( 注意 104 mod 8 == 0
,您将看到原因);
第二个和第三个将打印相同。 但是请注意 ,我们在这里对齐! 在x64上,对齐方式是在8B上,因此sizeof( char * )
给出8, sizeof( int )
给出4并由此得出12。 但是 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,因为没有元素,而第二个.size()
将返回2,因为列表中有2个元素。
sizeof(a)
是由所使用的字节数a
,不包括任何动态分配的内存。 这是一个编译时间常数。 您也可以将其与类型一起使用, sizeof(int)
提供sizeof(int)
的字节数。
通常为容器类型定义a.size()
,并给出容器中当前的元素数(而不是字节数)。 这是一个运行时值,随着您在容器中添加或删除对象而改变。
a.size()
为您提供了类特别的值。 例如字符串或列表的长度。 这取决于课程的类型和实施人员。 但通常size
是有意义的,如列表中所示。
如果您是新手程序员,那么应该避免使用sizeof运算符。 它被广泛应用在C到alloc
内存。 它返回对象在内存中占用的空间。 在C ++中,我们使用new
来动态分配内存。 这要容易得多。 有关sizeof的更多信息: http : //en.wikipedia.org/wiki/Sizeof
不确定a.size(),但sizeof(a)返回其长度( 以字节为单位) 。 如果需要数组中元素的数量,请将其除以每个元素的大小。 例如:
int size = sizeof(myArray) / sizeof(*myArray);
如果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.
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.