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

这当然会让您感到惊讶。这取决于编译器,如果在GNU c编译器中运行,则会发现sizeof(void)为1。但是在C ++中,它可能会引发警告或错误。

void表示为空,并且这也不是兼容类型,因此sizeof()应该抛出错误,但是令我们惊讶的是,在GNU c中,它输出1,这是由于编译器具有非标准扩展名引起的。

在GNU C中,指向void的指针和指向函数的指针支持加法和减法运算。这是通过将空隙函数的大小视为1来完成的。这样的结果是在void和函数类型上也允许sizeof,并返回

我希望本教程可以帮助您很好地了解sizeof运算符,并且您也有一些脑筋急转弯。最后,一个非常重要的事实是sizeof运算符不能重载