• C语言关键字之sizeof


    C语言关键字 sizeof 是一个操作符,返回对象或类型所占内存字节数,类型为size_t(定义在<stddef.h>),有2种用法:

    • sizeof unary-expression
    • sizeof (type-name)

    sizeof不能应用的场合:

    • an expression that has function type or an incomplete type
    • the parenthesized name of such a type
    • an expression that designates a bit-field member

    如果操作数的类型是VLA (variable length array),要进行evaluate;否则不需要evaluate,结果是一个整形常量。

    示例1 进程间通信 比如storage allocator 和 I/O system

    extern void *alloc(size_t);
    double *dp = alloc(sizeof *dp);

    示例2 计算数组中元素个数

    sizeof array / sizeof array[0]

    示例3 VLA大小计算

    #include <stddef.h>
    size_t fsize3(int n)
    {
      char b[n+3]; // variable length array
      return sizeof b; // execution time sizeof
    }
    int main()
    {
      size_t size;
      size = fsize3(10); // fsize3 returns 13
      return 0;
    }

    ANSI C规定字符型1字节,其余sizeof的返回结果与编译器实现相关。在32位系统中:

    1. 基本类型

    _Bool 1

    char 1

    short 2

    int 4

    long 4

    long long 8

    float 4

    double 8

    long double 12

    _Complex 16

    void 1

    2. 指针

    4

    3. 枚举

    4

    4. 数组

    数组长度 * 数组成员size

    5. 结构体

    字节对齐值:ALIGN
    基本类型成员:SIZE

    每个成员相对于结构体首地址的偏移都是min(ALIGN, SIZE)的整数倍,可能在成员间加填充字节
    结构体总大小为min(ALIGN, SIZEmax)的整数倍,可能在最后一个成员后加填充字节

    6. 联合

    规则类似struct

    测试程序:

    #include <stdio.h>
    #include <complex.h>
    
    #define SIZEOF(x) printf("size of '%s' is %zd
    ", #x, sizeof(x));
    
    int main() {
        SIZEOF(_Bool);
        SIZEOF(char);
        SIZEOF(short);
        SIZEOF(int);
        SIZEOF(long);
        SIZEOF(long long);
        SIZEOF(float);
        SIZEOF(double);
        SIZEOF(long double); // depends on -m128bit-long-double
        SIZEOF(_Complex);
        SIZEOF(void);
    
        SIZEOF(void*);
        SIZEOF(void (*)(void)); // function pointer
    
        SIZEOF(enum {E});
    
        SIZEOF(char [0]); // zero-size array
        SIZEOF(int [3]);
    
        SIZEOF(struct {}); // empty struct
        SIZEOF(struct {char c;});
        SIZEOF(struct {char c; short s;}); // alignment
        SIZEOF(struct {int i; char c;});
        SIZEOF(struct {int i; char c;} __attribute__((packed)));
    #pragma pack(push)
    #pragma pack(1)
        printf("With #pragma pack(1): ");
        SIZEOF(struct {int i; char c;});
    #pragma pack(pop)
        SIZEOF(struct {double d; char c;}); // depends on -malign-double
    
        SIZEOF(struct {char c1:4; char :2; char c2:2;}); // bit field
        SIZEOF(struct {int i:1; char c:2;});
    
        SIZEOF(struct {struct {int i; char c;}; short s;});
        SIZEOF(struct {struct {short s1; char c;}; short s2;});
        SIZEOF(struct {char c2; struct {short s1; char c1;}; short s2;});
    
        SIZEOF(union {char c; int i;}); // union
        return 0;
    }
  • 相关阅读:
    物理CPU,物理核,逻辑CPU,虚拟CPU(vCPU)区别 (转)
    JVM学习一:常用JVM配置参数
    docker架构
    Linux查看服务器配置
    redis清缓存
    httpclient源码分析之 PoolingHttpClientConnectionManager 获取连接 (转)
    CentOs7.6配置邮件服务并发送邮件
    linux之dmesg命令
    docker部署springboot项目
    如何查看文件是dos格式还是unix格式的?
  • 原文地址:https://www.cnblogs.com/chenkkkabc/p/2971283.html
Copyright © 2020-2023  润新知