相关疑难解决方法(0)

什么可以防止类中相邻成员重叠?

考虑以下三个方面struct

class blub {
    int i;
    char c;

    blub(const blub&) {}
};

class blob {
    char s;

    blob(const blob&) {}
};

struct bla {
    blub b0;
    blob b1;
};
Run Code Online (Sandbox Code Playgroud)

int4 字节的典型平台上,大小、对齐方式和总填充1如下:

  struct   size   alignment   padding  
 -------- ------ ----------- --------- 
  blub        8           4         3  
  blob        1           1         0  
  bla        12           4         6  

Run Code Online (Sandbox Code Playgroud)

blubblob成员的存储之间没有重叠,即使大小 1blob原则上可以“适合” blub.

C++20 引入了no_unique_address属性,它允许相邻的空成员共享相同的地址。它还明确允许使用一个成员的填充来存储另一个成员的上述场景。来自cppreference(强调我的):

指示此数据成员不需要具有与其类的所有其他非静态数据成员不同的地址。这意味着如果成员有一个空类型(例如无状态分配器),编译器可能会优化它以不占用空间,就像它是一个空基一样。如果该成员不为空,则其中的任何尾部填充也可以重新用于存储其他数据成员。

事实上,如果我们在 上使用这个属性blub b0,大小会bla …

c++ language-lawyer c++20

12
推荐指数
1
解决办法
376
查看次数

gcc/clang在基础结构的后填充中布局派生结构的字段

当涉及填充和继承时,我对gcc和clang如何布局结构感到困惑.这是一个示例程序:

#include <string.h>
#include <stdio.h>

struct A
{
    void* m_a;
};

struct B: A
{
    void* m_b1;
    char m_b2;
};

struct B2
{
    void* m_a;
    void* m_b1;
    char m_b2;
};

struct C: B
{
    short m_c;
};

struct C2: B2
{
    short m_c;
};

int main ()
{
    C c;
    memset (&c, 0, sizeof (C));
    memset ((B*) &c, -1, sizeof (B));

    printf (
        "c.m_c = %d; sizeof (A) = %d sizeof (B) = %d sizeof (C) = %d\n", 
        c.m_c, sizeof …
Run Code Online (Sandbox Code Playgroud)

c++ gcc padding clang

7
推荐指数
2
解决办法
437
查看次数

对 C++ 基类布局感到困惑

这是我的代码

#include <bits/stdc++.h>


class A{
    int val;
    char c;
};
class B:public A{
    char val;
};

struct C{
    int val;
    char c;
};
struct D:public C{
    char val;
};


int main()
{
    std::cout<<sizeof(B)<<std::endl; //8
    std::cout<<sizeof(D)<<std::endl; //12

}
Run Code Online (Sandbox Code Playgroud)

为什么class有不同的对齐方式struct


*** Dumping AST Record Layout
   0 | class A
   0 |   int val
   4 |   char c
     | [sizeof=8, dsize=5, align=4
     |  nvsize=5, nvalign=4]


*** Dumping AST Record Layout
   0 | class B
   0 |   class A (base)
   0 …
Run Code Online (Sandbox Code Playgroud)

c++ layout inheritance struct padding

5
推荐指数
1
解决办法
140
查看次数

C++ + gcc:尾部填充重用和 POD

相关问题:标准布局和尾部填充

片段:

#include <iostream>
#include <type_traits>

struct A0
{
    int a;
    char c;
};

struct B0 : A0
{ char d; };

struct A1
{
    int a;

private:
    char c;
};

struct B1 : A1
{ char d; };

struct A2
{
private:
    int a;
    char c;
};

struct B2 : A2
{ char d; };

int main()
{
    std::cout << std::is_pod<A0>::value << ' ' << sizeof(B0) << std::endl; // 1 12
    std::cout << std::is_pod<A1>::value << ' ' << …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance padding abi

5
推荐指数
1
解决办法
607
查看次数

什么导致继承和成员之间结构大小的差异?

我无法理解以下代码中 C 和 C2 大小差异的原因:

#include <iostream>

struct A {
    int* x;
};

struct B {
    A a;
    int y;
};

struct C : B {
   int z;
};

struct B2 : A {
   int y;
};

struct C2 : B2 {
   int z;
};
    
int main()
{
    std::cout << sizeof(A) << std::endl; // 8
    std::cout << sizeof(B) << std::endl; // 16
    std::cout << sizeof(C) << std::endl; // 24
    std::cout << sizeof(B2) << std::endl; // 16
    std::cout << sizeof(C2) << …
Run Code Online (Sandbox Code Playgroud)

c++ sizeof

2
推荐指数
1
解决办法
60
查看次数

标签 统计

c++ ×5

padding ×3

inheritance ×2

abi ×1

c++20 ×1

clang ×1

gcc ×1

language-lawyer ×1

layout ×1

sizeof ×1

struct ×1