带指针的Struct的大小

时间:2016-08-24 23:41:19

标签: c++ struct sizeof

我编译了这段代码:

// Fix BottomSheetDialog not showing after getting hidden when the user drags it down
    myBottomSheetDialog.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialogInterface) {
            BottomSheetDialog bottomSheetDialog = (BottomSheetDialog) dialogInterface;
            FrameLayout bottomSheet = (FrameLayout) bottomSheetDialog
                    .findViewById(android.support.design.R.id.design_bottom_sheet);
            BottomSheetBehavior.from(bottomSheet).setState(BottomSheetBehavior.STATE_COLLAPSED);
        }
    });

我得到了这个结果:

// Example program
#include <iostream>
using namespace std;
struct A
{
    char a;
};
struct B
{
    char b;
    int a;
};
struct C
{
    int * a;
    unsigned char b;
};

int main()
{
    cout<< "size of Strcut A:\t"<< sizeof(A)<<endl;
    cout<< "size of Strcut B:\t"<< sizeof(B)<<endl;
    cout<< "size of Strcut C:\t"<< sizeof(C)<<endl;
    cout<< "size of int* :  \t"<< sizeof(int*)<<endl;
    return 0;
}

现在我想问为什么Strcut B的大小不是5?为什么Struct C的大小不是9? 当内存在嵌入式系统中是重要的时候我应该如何在ARM等其他平台上节省内存?

我可以对编译器说5个字节或9个字节吗?

http://cpp.sh/2rv6b

2 个答案:

答案 0 :(得分:1)

Alignment。数据结构的成员(及其总大小)之间填充空白空间,以便加快访问速度并减少当较大类型跨越边界时必需的冗余读取。

答案 1 :(得分:1)

编译器决定添加一些额外的填充位来对齐你的结构。 使用8个数据的功能然后花时间从内存中提取它们要快得多。