函数指针的优化

本文探讨了在VS2015中,函数指针的不同形式及其被编译器优化的情况。强调了函数指针的主要作用在于降低函数间的耦合度,提高函数的内聚性。

vs2015里

void func()
{
    printf("hello world\n");
}

// 1
typedef void(*FUNC_TYPE)();
FUNC_TYPE p = &func; 
(*p)();

//2
typedef void(*FUNC_TYPE)();
FUNC_TYPE p = func;
(*p)();

// 3
typedef void(*FUNC_TYPE)();
FUNC_TYPE p = &func; 
p();

//4
typedef void(*FUNC_TYPE)();
FUNC_TYPE p = func;
p();

// 5
typedef void(FUNC_TYPE)();
FUNC_TYPE p = &func; 
(*p)();

//6
typedef void(FUNC_TYPE)();
FUNC_TYPE p = func;
(*p)();

// 7
typedef void(FUNC_TYPE)();
FUNC_TYPE p = &func; 
p();

//8
typedef void(FUNC_TYPE)();
FUNC_TYPE p = func;
p();

这几个形式都是对的,理解为编译器的优化。。。。

函数指针存在的意义我觉得是为了降低函数之间的耦合,增加函数的内聚

在单片机程序设计中,Switch/Case语句虽然直观易用,但当处理大量分支或逻辑复杂时,代码可读性、可维护性及可移植性会受到影响。为了解决这些问题,可以采用函数指针优化程序设计,下面将详细介绍如何实现这一优化过程。 参考资源链接:[函数指针优化:替代单片机复杂Switch/Case编程](https://wenku.youkuaiyun.com/doc/6401ad0bcce7214c316ee15c?spm=1055.2569.3001.10343) 首先,函数指针允许程序通过指针调用函数,这样可以将每个case对应的逻辑封装在独立的函数中。这样做的好处是将逻辑分散到多个小函数中,每个函数只处理一个分支,代码结构更加清晰,也便于维护和理解。 以一个单片机控制LED灯亮度的场景为例,假设有一个输入参数根据不同的值需要执行不同的亮度调节函数,传统方法会使用大量的if-else或Switch/Case结构。采用函数指针后,可以为每个亮度级别定义一个函数,并通过函数指针数组来调用。 例如: ```c // 定义函数指针类型 typedef void (*BrightnessFunction)(void); // 声明不同亮度级别的处理函数 void bright_10() { /* 亮度设置为10 */ } void bright_20() { /* 亮度设置为20 */ } // ... 其他亮度设置函数 // 创建函数指针数组并初始化 BrightnessFunction brightness_table[] = {bright_10, bright_20, /* ... */}; // 使用输入参数作为索引,通过函数指针调用相应的函数 void adjust_brightness(int level) { if(level >= 0 && level < sizeof(brightness_table)/sizeof(brightness_table[0])) { brightness_table[level](); // 调用对应亮度级别的函数 } } ``` 通过这种方式,原本复杂的Switch/Case结构被简化为一个清晰的函数指针数组调用,代码的可读性和可维护性得到显著提升。同时,由于函数的独立性,后续对逻辑的修改和扩展更为便捷,也便于将程序移植到其他平台时调整和适配。 此外,函数指针不仅有助于简化程序结构,还能够减少代码冗余,提高代码的紧凑性。在单片机等资源受限的环境中,这一点尤为重要。 为了更深入地理解如何在单片机编程中应用函数指针优化Switch/Case结构,推荐阅读《函数指针优化:替代单片机复杂Switch/Case编程》。该资料详细介绍了函数指针的使用方法、代码示例以及实际应用中的好处,不仅帮助解决当前问题,还提供了进一步学习的深度和广度。 参考资源链接:[函数指针优化:替代单片机复杂Switch/Case编程](https://wenku.youkuaiyun.com/doc/6401ad0bcce7214c316ee15c?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值