C / C ++中的sizeof()运算符
sizeof()
运算符的定义
sizeof运算符是一元运算符,它采用单个操作数,并且该操作数可以是数据类型,变量,对象,表达式以及任何具有大小(即,需要一些内存)的东西。我们将在示例部分中看到sizeof运算符的用法,尽管您可能从未见过。
sizeof()
运算符详情
数据类型的sizeof()运算符
众所周知,不同版本的编译器会将不同数量的内存分配给数据类型。就像在早期版本中,为整数分配了2个字节的内存,而在最新版本中,它分配了4个字节。我们可以使用sizeof运算符轻松地进行检查。
#include <stdio.h> int main(){ printf("size of integer data type is: %lu\n", sizeof(int)); printf("size of float data type is: %lu\n", sizeof(float)); printf("size of double data type is: %lu\n", sizeof(double)); printf("size of character data type is: %lu\n", sizeof(char)); return 0; }
输出:
size of integer data type is: 4 size of float data type is: 4 size of double data type is: 8 size of character data type is: 1
变量,表达式的sizeof运算符
我们还可以使用sizeof运算符来查找任何变量,表达式的大小。以下程序显示了如何使用sizeof运算符查找任何变量的大小。
#include <stdio.h> int main(){ int a; char b; float c; double d; long e; long long f; long long int g; printf("sizeof a which is of type int is: %lu\n", sizeof(a)); printf("sizeof a which is of type char is: %lu\n", sizeof(b)); printf("sizeof a which is of type float is: %lu\n", sizeof(c)); printf("sizeof a which is of type double is: %lu\n", sizeof(d)); printf("sizeof a which is of type long is: %lu\n", sizeof(e)); printf("sizeof a which is of type long long is: %lu\n", sizeof(f)); printf("sizeof a which is of type long long int is: %lu\n", sizeof(g)); return 0; }
输出:
sizeof a which is of type int is: 4 sizeof a which is of type char is: 1 sizeof a which is of type float is: 4 sizeof a which is of type double is: 8 sizeof a which is of type long is: 8 sizeof a which is of type long long is: 8 sizeof a which is of type long long int is: 8
以下程序显示了如何使用sizeof运算符查找任何表达式的大小,
#include <stdio.h> int main(){ int a = 9; char b = 'a'; float c = 8.7; double d = 0.99; long e = 12; long long f = 13; long long int g = 16; printf("sizeof a+c which is of type int+float is: %lu\n", sizeof(a + c)); printf("sizeof c+d which is of type float+doyble is: %lu\n", sizeof(c + d)); printf("sizeof a+e which is of type int+long is: %lu\n", sizeof(a + e)); printf("sizeof a+c+f which is of type int+float+long long is: %lu\n", sizeof(a + c + f)); return 0; }
输出:
sizeof a+c which is of type int+float is: 4 sizeof c+d which is of type float+doyble is: 8 sizeof a+e which is of type int+long is: 8 sizeof a+c+f which is of type int+float+long long is: 4
如果您遵守上述程序,sizeof运算符将告诉您有关数据类型扩展的概念。没有当你将你加入观察INT一个与长音e,将得到的具有8个字节,其是相同的尺寸的尺寸长。因此,这意味着,虽然你有一个整型作为操作数,则结果的数据类型为长,由于观念的数据类型扩大。当您将float类型c添加为double类型8时,这也类似,同样,我们看到了数据类型扩大的实例。sizeof运算符也可以帮助您验证概念。
sizeof运算符,用于查找对象的sizeof
为了找到对象的大小,我们可以轻松地使用sizeof运算符。通常,对象的大小是其组成数据成员的总和。可以保证对象的大小永远不会小于该大小,但是编译器所做的是,编译器在数据成员之间添加填充以确保平台的对齐要求。那可以通过使用sizeof运算符轻松地进行检查。
下面是一个示例,其中对象具有三个数据成员,一个字符串和两个整数。因此,大小应该为8(取决于编译器,可以使用sizeof运算符检查字符串的大小)+4+4,但是由sizeof运算符找到的大小为24,这是由于编译器添加了填充空间。
#include <iostream> using namespace std; class student { public: int roll; string name; int marks; }; int main(){ student st; st.name = "xyz"; st.roll = 1; st.marks = 80; printf("sizeof student object st is: %lu\n", sizeof(st)); return 0; }
输出:
sizeof student object st is: 24
sizeof运算符,用于查找数组大小
我们可以使用sizeof运算符来查找数组大小。数组大小将为数组长度*sizeof(数据类型)。
#include <iostream> using namespace std; int main(){ int marks[20]; cout << "//数组标记的大小为: " << sizeof(marks) << endl; return 0; }
输出:
//数组标记的大小为: 80
sizeof运算符还可以很容易地找到数组的长度。数组的长度为
length of array= sizeof(array)/sizeof(datatype)
下面是一个示例:
#include <iostream> using namespace std; int main(){ int arr[] = { 12, 76, 45, 10, 5, 1, 6, 17, 89 }; cout << "//数组arr的长度是: " << sizeof(arr) / sizeof(int) << endl; return 0; }
输出:
//数组arr的长度是: 9
使用sizeof运算符进行动态内存分配
以下是我们使用malloc()函数动态分配内存的示例,其中sizeof帮助定义单个元素的大小,
#include <stdio.h> #include <stdlib.h> int main(){ int* arr = (int*) malloc(sizeof(int) * 20); for (int i = 0; i < 10; i++) arr[i] = i; if (arr == NULL) printf("Memory couldn't be allocated\n"); else printf("Memory got allocated\n"); return 0; }
输出:
Memory got allocated
让我们更多地使用sizeof运算符,这可能是严重的脑筋。
猜测以下代码的输出。
代码1:
#include <bits/stdc++.h> using namespace std; int main(){ queue<int> q; stack<int> st; vector<int> a; cout << "//队列q的大小为:" << sizeof(q) << endl; cout << "//堆栈st的大小是:" << sizeof(st) << endl; cout << "//向量a的大小是:" << sizeof(a) << endl; return 0; }
您是否猜测所有输出均为0,对吗?由于最初所有为空,因此所有都应为0。聪明的队友!
不错的猜测。
现在来看输出
//队列q的大小为:80 //堆栈st的大小是:80 //向量a的大小是:24
糟糕!这他妈到底是什么?空队列的大小如何为80?空堆栈的大小如何为80?空向量的大小如何为24?
有什么隐藏的东西吗?
是的,事情是sizeof只给您获得的内存。它不在乎其他任何东西。每当我们使用STL时,每种STL类型(例如队列,堆栈,向量,映射等)背后都有实现。您可以在模板后面找到实际的实现,并在那里找到有助于这些输出的数据成员。因此,尽管这些对象实例为空,但它们占用了一些内存。
好吧,如果您已经猜到它将输出除0以外的其他内容,那就做得很好。
代码2:
#include <bits/stdc++.h> using namespace std; int main(){ int* arr = (int*)(malloc(sizeof(int) * 10)); for (int i = 0; i < 10; i++) arr[i] = i; cout << "//arr的大小是: " << sizeof(arr) << endl; return 0; }
您可能猜到它是40,即sizeof(int)*10=4*10
好的!让我们检查输出,
//arr的大小是: 8
糟糕!怎么会是8?正如我们在Sizeof运算符中看到的那样,它应该给您正确的数组大小,以找到数组大小部分。
但是它是8。原因是它打印了指针的大小,并且编译器通常将所有指针分配为8字节。因此,它与打印数组的大小不同,因为它只是一个指针。
因此,输出为8
代码3:
#include <stdio.h> void f(int a) { a = 10; return; } int main(){ int a = 5; printf("sizeof function f: %lu\n", sizeof(f(a))); return 0; }
您可能猜到了0,因为它将返回void,并且void表示为空。哦,你猜出来编译错误了吗?太棒了!!
让我们看看它的输出,
sizeof function f: 1
这当然会让您感到惊讶。这取决于编译器,如果在GNUc编译器中运行,则会发现sizeof(void)为1。但是在C++中,它可能会引发警告或错误。
void表示为空,并且这也不是兼容类型,因此sizeof()应该抛出错误,但是令我们惊讶的是,在GNUc中,它输出1,这是由于编译器具有非标准扩展名引起的。
在GNUC中,指向void的指针和指向函数的指针支持加法和减法运算。这是通过将空隙或函数的大小视为1来完成的。这样的结果是在void和函数类型上也允许sizeof,并返回
我希望本教程可以帮助您很好地了解sizeof运算符,并且您也有一些脑筋急转弯。最后,一个非常重要的事实是sizeof运算符不能重载。