1. C++ 中 sizeof 关键字

sizeof 是 C 语言中的运算符,用来计算一个类型/对象的所占用的内存大小,有些 C/C++ 面试官会出一些 sizeof(xxx) 的大小是多少的问题。

sizeof计算大小的小技巧

我总结了几个关键的点,掌握这几个基本上就能答对大部分类似问题了:

  1. 指针的大小永远是固定的,取决于处理器位数,32位就是 4 字节,64位就是 8 字节
  2. 数组作为函数参数时会退化为指针,大小要按指针的计算, 详细请看这篇文章数组退化为指针(opens new window)
  3. struct 结构体要考虑字节对齐,字节对齐的具体规则请看这篇文章: 字节对齐(opens new window)
  4. 字符串数组要算上末尾的 '\0'

举例:

// 前提: 64 位电脑上

char  str[] = "Hello World" ;
char   *p = str;
double *dp;
int n = 10;

sizeof(str )=___12_____  // 11个字符 + 末尾'\0',总结第四点
    sizeof ( p ) =  ___8 ___  // 64 位电脑,指针 8 个字节
sizeof ( n ) = ___4______  // int 一般 4 个字节

void Func (char str[10])
{
sizeof( str ) = _8__  // 数组做参数退化为 char类型指针,即 8 个字节,总结第2点
}
void *vp = malloc( 100 );

sizeof ( vp )=__8____  // vp 是一个 void 类型指针,还是 8 个字节

    struct AlignedStruct {
char a;   // 本来1字节,padding 3 字节
int b;    //  4 字节
short c;  // 本来 short 2字节,但是整体需要按照 4 字节对齐(成员对齐边界最大的是int 4) ,
//所以需要padding 2,总共: 4 + 4 + 4
};
sizeof(AlignedStruct) = ___12__, 具体分析见上面 👆

2. sizeof 和 strlen

很多 C++ 的同学对于一些基本的 C 库函数没有掌握,面试的时候我遇到不少同学说 不清楚如何获得一个 char* 类型的字符串长度,这是一定不可以的。

接下来讲一下 sizeof 和 strlen。

strlen 是头文件 中的函数,而 sizeof 是 C++ 中的运算符。

2.1. strlen

strlen 是一个 C 标准库中的函数,用于计算 C 风格字符串(以空字符 '\0' 结尾的字符数组)的长度,即不包括结尾的空字符的字符个数。

#include <iostream>
#include <cstring>

int main() {
    char str[] = "Hello, world!";
    std::cout << "Length of str: " << strlen(str) << std::endl; // 输出字符串 str 的长度
}

strlen 源代码如下:

size_t strlen(const char *str) {
    size_t length = 0;
    while (*str++)
        ++length;
    return length;
}

2.2. sizeof

sizeof 是一个 C++ 编译期间计算的操作符,用于计算数据类型或对象所占用的字节数。

#include <iostream>
int main() {
    int a = 42;
    std::cout << "Size of int: " << sizeof(int) << std::endl;    // 输出 int 类型的大小
    std::cout << "Size of a: " << sizeof(a) << std::endl;        // 输出变量 a 的大小
    std::cout << "Size of double: " << sizeof(double) << std::endl; // 输出 double 类型的大小
}

Unity游戏开发之路:unitykit.cn

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐