有的結構體定義裏成員後面還跟個”:1“或者”:4“……
這個問題是看交給我維護的結構體代碼時發現的,因爲過去沒見過,百度了一下還不錯找到了意思解釋,然後自己又用sizeof()試了試,挺好玩的,分享出來~
=========分割線=========得知自:https://wenwen.sogou.com/z/q771353044.htm
struct BIT16_flag{
unsigned char b0:1;
...............
unsigned char b15:1;
};
我知道這個結構體裏面有 16個 char 成員,
我想問這個結構體 一共佔多少個字節?
還有,每個變量 後面加個 :1 是什麼意思?
下面是找到的解釋:
每個都佔一位```若不夠放存入下個字節中··
1共佔2個字節``
:1是按位存儲·
如
struct xxx
{
成員 1 類型成員 1 : 成員 1 位數 ;
成員 2 類型成員 2 : 成員 2 位數 ;
成員 3 類型成員 3 : 成員 3 位數 ;
};
基本的成員變量就會被拆分!這個語法在初級編程中很少用到,但是在高級程序設計中不斷地被用到!例如:
struct student
{
unsigned int sex : 1;
unsigned int age : 15;
};
上述結構體中的兩個成員 sex 和 age 加起來只佔用了一個 unsigned int 的空間(假設 unsigned int 爲 16 位)。
基本成員變量被拆分後,訪問的方法仍然和訪問沒有拆分的情況是一樣的,例如:
struct student sweek;
sweek.sex = MALE;// 這裏的 MALE 只能是 0 或 1 ,值不能大於 1
sweek.age = 20;
雖然拆分基本成員變量在語法上是得到支持的,但是並不等於我們想怎麼分就怎麼分,例如下面的拆分顯然是不合理的:
struct student
{
unsigned int sex : 1;
unsigned int age : 12;
};
這是因爲 1+12 = 13 ,不能再組合成一個基本成員,不能組合成 char 、 int 或任何類型,這顯然是不能 “ 自圓其說 ” 的。
=====分割線===============
以下是自己寫的:
這是c++11裏才能用的東西。
另外sizeof只能返回整數的字節數,遇到不足1字節的會報錯,但是當結構體所有成員的類型所佔內存超過了1字節則能使用,而且有內存補齊的影響。
複製運行一下下面我給出的代碼,再看一遍註釋,就都能明白了~
#include<iostream>
using namespace std;
struct A
{
char one : 4;//4 bit=0.5 Byte
char ten : 4;
//0.5+0.5=1字節
};
struct B
{
char one : 1;//1 bit=0.5 Byte
};
struct C
{
char one : 4;//0.5Byte=4bit
char ten;//1byte=8bit
int hun;//4byte=32bit
};
void main()
{
struct A a;
cout << sizeof(a) << endl;
struct B b;
cout << sizeof(b) << endl;//0.5字節,不足1字節,使用sizeof會出錯(有的編譯器不出錯,而輸出1)
struct C c;
cout << sizeof(c) << endl;//由於內存補齊,最大爲int,2int的8byte>(0.5byte+1byte+4byte),所以輸出8
//類型c的問題是 用sizeof函數來定義報文長度時需要注意的地方!
}