您身边的网站建设专家
成功案例

【建站服务】塔城爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广-域名申请

日期: 2022-09-21 05:43:45 浏览数:4


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。



塔城爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广

网站建设.png

  1. T1: 若从第 0 个字节开始分配内存,则 T1.x 存入第 0 字节,T1.y 占 4 个字节,由于第一的 4 字节已有数据,所以 T1.y 存入第 4-7 个字节,T1.z 占 8 个字节,由于第一个 8 字节已有数据,所以 T1.z 存入 8-15 个字节。共占有 16 个字节。

    T2: 若从第 0 个字节开始分配内存,则 T1.x 存入第 0 字节,T1.z 占 8 个字节,由于第一的 8 字节已有数据,所以 T1.z 存入第 8-15 个字节,T1.y 占 4 个字节,由于前四个 4 字节已有数据,所以 T1.z 存入 16-19 个字节。共占有 20 个字节。此时所占字节不是最宽元素(double 长度为 8)的整数倍,因此将其补齐到 8 的整数倍,最终结果为 24。

    karma

       karma

      119***7665@qq.com

    4年前 (2018-08-09)
  2.    xkl

      923***865@qq.com

    18

    补充楼上 @karma,位域的内存大小测试

    // 位域内存测试#include <stdio.h>struct ONE_BYTE{
        unsigned char _bool : 1;
        unsigned char del_flag : 1;
        unsigned char status : 4;} one_byte;struct TWO_BYTE{
        unsigned char ccc1 : 4;
        unsigned char ccc2 : 4;
        unsigned char ccc3 : 4;
        unsigned char ccc4 : 4;} two_byte;struct THREE_BYTE{
        unsigned char ccc1 : 4;
        unsigned char ccc2 : 4;
        unsigned char ccc3 : 4;
        unsigned char ccc4 : 4;
        unsigned char ccc5 : 4;} three_byte;struct FOUR_BYTE{
        unsigned int ccc1 : 16;
        unsigned int ccc2 : 16;} four_byte;struct EIGHT_BYTE{
        unsigned char ccc1 : 1;
        unsigned int ccc2 : 1;} eight_byte;int main(int argc, char const *argv[]){
        printf("sizeof one_byte is : %lu
    ", sizeof(one_byte));
        printf("sizeof two_byte is : %lu
    ", sizeof(two_byte));
        printf("sizeof three_byte is : %lu
    ", sizeof(three_byte));
        printf("sizeof four_byte is : %lu
    ", sizeof(four_byte));
        printf("sizeof eight_byte is : %lu
    ", sizeof(eight_byte));
        return 0;


}

输出结果为:


sizeof one_byte is : 1B

sizeof two_byte is : 2B

sizeof three_byte is : 3B

sizeof four_byte is : 4B

sizeof eight_byte is : 4B

由输出,可以验证以下结论:


(1)结构体内存分配原则:


原则一:结构体中元素按照定义顺序存放到内存中,但并不是紧密排列。从结构体存储的首地址开始 ,每一个元素存入内存中时,它都会认为内存是以自己的宽度来划分空间的,因此元素存放的位置一定会在自己大小的整数倍上开始。

原则二: 在原则一的基础上,检查计算出的存储单元是否为所有元素中最宽的元素长度的整数倍。若是,则结束;否则,将其补齐为它的整数倍。

(2)定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。


xkl

   xkl


  923***865@qq.com


3年前 (2019-04-09)

   木子李


  Li1***052573@163.com


67

// 二进制表示为 1000 有四位,超出

Age.age = 8;

printf("Age.age : %d ", Age.age);

超出范围并不是直接丢弃,而是保留对应的 3 位的值。


比如 8 是 00001000,按照位域,对应 3 位的值是 000,所以打印结果是 0;


但是 9 是 00001001,按照位域,对应 3 位的值是 001,所以打印结果是 1;


同理 10 是 00001010,按照位域,对应 3 位的值是 010,所以打印结果是 2;


Age.age = 9; // 二进制表示为 1001 有四位,超出

printf( "Age.age : %d ", Age.age );

   

Age.age = 10; // 二进制表示为 1010 有四位,超出

printf( "Age.age : %d ", Age.age );

// 以下是 4,7,8,9,10 的打印结果

Sizeof( Age ) : 4

Age.age : 4

Age.age : 7

Age.age : 0

Age.age : 1

Age.age : 2

木子李

   木子李


  Li1***052573@163.com


3年前 (2019-08-23)

   xuxing


  176***6295@qq.com


4

三楼@xkl,结果是:


sizeof one_byte is:1

sizeof two_byte is:2

sizeof three_byte is:3

sizeof four_byte is:4

sizeof eight_byte is:8

讲一下为什么 struct ONE_BYTE,其 3 个位域都是 char 类型,所以可以按照位的顺序存储(不用分字节),1+1+4=6 位,占用 1 个字节。


struct TWO_BYTE,道理同上,4+4+4+4=16 位 =2 个字节。


struct THREE_BYTE,道理同上,4*5=20 位,占 3 个字节(不足的 4 位补 0)。


struct FOUR_BYTE,其 2 个位域都是 int 类型,所以可以按照位的顺序存储(不用分字节),一个 int 类型占 4 个字节,刚好 16+16=32 位 =4 个字节。为 int 类



塔城爱采购会员/58同城会员账户/百度竞价开户/百家号注册运营/推广公司网站-网站营销全网推广



上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站