zoukankan      html  css  js  c++  java
  • g++上c++模板与padding交互产生的陷阱

     

    关于Padding,请看下面的代码:

    #pragma pack(1)
    struct A
    {
             
    char c;
             
    int i;
    };
    #pragma pack()
    struct A2
    {
             
    char c;
             
    int i;
    };

    我们可以assert:

    assert(sizeof(A) == 5);
    assert(
    sizeof(A2) == 8); // 假设32位编译环境

    这里的padding大小我们基本都可以预测。

    由于c++模板的代码生成规则,下面的代码可能不会注意到

    template<typename T>
    struct BT
    {
             
    int a;
    };

    #pragma pack(1)
    struct B
    {
             
    char c;
             BT b;
    };

    #pragma pack()
    struct B2
    {
             
    char c;
             BT b;
    };

    这时sizeof(B2)以及B2::b的偏移地址是多少?

    struct BT第一次被实例化是在struct B内,且此时的pack1.于是该类的alienment也被当作1来处理

    到后面的B2内,虽然pack已经恢复(为4)但balienment值仍然为1,于是sizeof(B2)==5B2::b的偏移为1而不是4

    注意:在vc上,这个sizeof(B2)==8B2::b的偏移为4,仍然是我们所期望的。

     

  • 相关阅读:
    二分法查找递归方式()
    JDBC操作MySQL(crud)
    (转)JAVA中的权限修饰符
    抽象类和接口(面试题总结)
    java基础-集合
    Java泛型通配符以及限定
    div中嵌套的多个div使用了浮动后居中的办法
    将博客搬至CSDN
    (补)Java解析XML之dom4j
    Java单元测试
  • 原文地址:https://www.cnblogs.com/kaikai/p/1529382.html
Copyright © 2011-2022 走看看