关键字小结

一、this 关键字的作用:
    1.访问对象的属性或方法(当前对象)
    2.调用其他构造方法
    3.代表本对象

    例1:ChildClass( ){
                      this(18);      //必须出现在第一行                  

                   //super( );   //必须出现在第一行  已经在this(18)中调用过super了,不用再调用了
 
              }

            ChildClass(int n){
                            super();
              }

二、 super关键字的作用:
    1.明确访问父类的方法或属性
    2.super用来明确调用父类的构造方法
      注: 如果父类是无参构造方法,通常来说不用明确写 super();编译器会添加
              只有调用父类的有参构造方式时,必须用super关键字

例2:class  Node{
              int val;
             Node next;

             public String toString( ){
                 return String.format("Node")

             }
         }

二者的对比
                 this                  vs            super
1.    调用其他构造方法            调用父类构造方法
2.    访问本类属性/方法            访问父类属性/方法
3.    代表当前对象            (因为父类对象只是想象中的)

三、abstract 关键字的作用:
  1.修饰类,该类是抽象类,无法被实例化的类,等着被继承的类        
              //abstract class A { }        new  A;
  2.修饰方法,该方法是抽象方法,没有被实现的方法        //abstract method();

  3.包含抽象方法的,必须是抽象类;抽象类不一定包含抽象方法。

四、final关键字的作用:
  1.修饰变量,该变量的值只能被初始化一次,无法在被修改
  2.修饰类,该类无法被继承
  3.修饰方法,该方法无法被覆写

    注:final类中不可以有abstract方法
           final类和final方法完全独立

在C语言中,结构体的大小并非由某个关键字直接设置,而是受到内存对齐规则的影响。内存对齐是为了提高访问效率,CPU通常要求数据存取地址是其大小的倍数(例如4字节的数据应从4的倍数地址开始)。为了确保这种对齐,编译器会根据成员变量的类型自动进行填充(padding),从而可能导致结构体的实际大小大于所有成员变量大小之和。 ### 如何控制结构体大小 1. **调整成员顺序** 通过合理排列结构体成员的顺序,可以减少因对齐而产生的填充空间。例如,在以下两个结构体定义中,尽管成员相同,但不同的顺序会导致结构体的总大小不同: ```c struct S1 { char c1; int i; char c2; } s1; struct S2 { char c1; char c2; int i; } s2; printf("%zu\n", sizeof(s1)); // 输出可能是12 printf("%zu\n", sizeof(s2)); // 输出可能是8 ``` 在这个例子中,`S2` 的设计减少了填充,因此其总大小更小[^2]。 2. **使用预处理指令 `#pragma pack` 控制对齐方式** C语言允许通过 `#pragma pack(n)` 指令来指定结构体成员的对齐方式,其中 `n` 表示按 `n` 字节对齐(常见的值为1、2、4、8等)。这会影响编译器如何插入填充字节。 ```c #pragma pack(1) // 设置为1字节对齐 struct PackedStruct { char a; int b; char c; }; #pragma pack() // 恢复默认对齐方式 printf("%zu\n", sizeof(struct PackedStruct)); // 输出可能是6,而不是默认的12 ``` 3. **使用 `offsetof` 宏查看成员偏移量** 为了更好地理解结构体内存布局,可以使用标准库 `<stddef.h>` 中的 `offsetof` 宏来获取某个成员相对于结构体起始地址的偏移量。 ```c #include <stdio.h> #include <stddef.h> struct test { char a; int b; char c; }; int main() { printf("Offset of b: %zu\n", offsetof(struct test, b)); // 可能输出4 return 0; } ``` 这有助于分析结构体内部填充情况,并优化成员顺序以节省空间[^3]。 4. **手动插入填充字段** 如果需要特定的内存布局(例如用于网络协议或硬件接口),可以在结构体中手动插入无名填充字段,以显式控制内存分布。 ```c struct ManualPadding { char a; char pad[3]; // 手动填充3字节,使int对齐到4字节边界 int b; }; ``` 5. **使用 `__attribute__((packed))`(GCC扩展)** 在支持 GCC 编译器的环境中,可以通过 `__attribute__((packed))` 来禁用结构体成员之间的填充,强制紧凑排列。 ```c struct __attribute__((packed)) PackedWithAttribute { char a; int b; char c; }; printf("%zu\n", sizeof(struct PackedWithAttribute)); // 输出6 ``` ### 小结 虽然没有直接的关键字用于“设置”结构体大小,但通过调整成员顺序、使用 `#pragma pack` 或 `__attribute__((packed))` 等方法,可以有效控制结构体的内存布局和大小。此外,了解并利用 `offsetof` 宏可以帮助开发者更好地理解和优化结构体的对齐行为。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值