zoukankan      html  css  js  c++  java
  • c++ sizeof和alignof区别

    sizeof : 获取内存存储的大小。
    alignof : 获取地址对其的大小,POD里面最大的内存对其的大小。

     1 struct A{ //non-POD type
     2     int avg;
     3     int avg2;
     4     double c;
     5     A(int a,int b):avg((a+b)/2){
     6 
     7     }
     8 };
     9 
    10 struct B{
    11     int avg;
    12     int avg2;
    13     char c;
    14 };
    15 using namespace std;
    16 int main() {
    17 
    18     cout<<"sizeof(A):"<<sizeof(A)<<endl;
    19     cout<<"alignof(A):"<< alignof(A)<<endl;
    20 
    21     cout<<"sizeof(B):"<<sizeof(B)<<endl;
    22     cout<<"alignof(B):"<< alignof(B)<<endl;
    23 }

    输出结果:

    sizeof(A):16
    alignof(A):8
    sizeof(B):12
    alignof(B):4
    

    std::aligned_storage可以看成一个内存对其的缓冲区,原型如下:

    template<std::size_t Len, std::size_t Align >= /default-alignment/>

    Len表示所存储类型的sie, Align表示该类型的内存对齐大小

    #include <iostream>
    using namespace std;
    
    struct A
    { //non-POD type
      int avg;
      int avg2;
      double c;
      A(int a, int b) : avg((a + b) / 2) {}
    };
    
    int main()
    {
      typedef std::aligned_storage<sizeof(A), alignof(A)>::type A_pod;
      A_pod a, b;
      new (&a) A(10, 20);
      b = a;
      // cout<<b.avg<<endl;//错误
      //  cout<< reinterpret_cast<A>(b).avg<<endl;//错误
      cout << reinterpret_cast<A &>(b).avg << endl; //正确
      return 0;
    }
  • 相关阅读:
    无线路由器的工作模式
    php 利用root 权限执行shell脚本
    shell 终端常用插件
    linux space/mark设置
    推送唯一标识符
    微信支付跨平台软件架构
    celery 动态配置定时任务
    两个报文是如何进行 TCP 分组传输
    接口 Interfaces
    How does Circus stack compare to a classical stack?
  • 原文地址:https://www.cnblogs.com/sunbines/p/15240551.html
Copyright © 2011-2022 走看看