在stm32单⽚机中使⽤c++与c语⾔的对⽐
在stm32单⽚机中使⽤c++与c语⾔的对⽐
简介
单⽚机能够⽤c++来编写,这件事放到现在已经不是什么新鲜事,将它放在实际的开发中也有其存在意义,例如:某通讯接⼝上位机⽤的是⾯向对象的⽅法开发的,到了下位机则可以考虑⽤c++开发,以此节约c语⾔处理⾯向对象问题的时间,以及后续维护成本。
虽然话是这样说,但现实情况是⼀想到c++要运⾏在单⽚机上,下秒的想法便是c++太⼤了,不适合⽤在单⽚机上。所以单⽚机这到底要不要⽤c++开发这⼀问题其实挺让⼈犹豫的。
到这⾥再回顾⼀下我举的例⼦,有个通讯协议⽤的是⾯向对象⽅法开发的,如果我⽤c++开发的话,我也不⽤什么STL容器、智能指针、流,那我这所谓的c++会很⼤吗?仔细想想,类好像⽐结构多个虚函数表,那类好像⼤不到哪⾥去,⾄于执⾏效率考虑到动态多态会有额外花费,但应该不会是什么致命问题。
如果以上猜测没问题的,那在单⽚上⽤c++来开发这种⾯向对象的接⼝,应该是⼀不错的选择。下⾯将进⾏验证。
环境
对⽐
代码结构按照上⾯的⼀个链接,仅在start.cpp(c++编译)和start.c(c语⾔编译)中做修改。
左边test_c.bin为c,右边test.bin为c++
c实现继承多态对⽐c++
代码
start.c
#include "start.h"
#include "main.h"
extern UART_HandleTypeDef huart1;
typedef void (*FUN)();
uint8_t ii;
typedef struct
{
uint8_t a;
FUN _fun;
} Base;
typedef struct
{
Base parent;
uint8_t b;
} Child;
void fun1()
{
ii = '0';
//HAL_UART_Transmit(&huart1, &ii, 1, 10000); }
void fun2()
{
ii = '9';
//HAL_UART_Transmit(&huart1, &ii, 1, 10000); }
void test()
{
Base parent;
Child child;
parent._fun = fun1;
child.parent._fun = fun2;
Base* p = &parent;
p->_fun();
p = (Base*)&child;
p->_fun();
}
void startup()
{
uint8_t chr = 'c';
HAL_UART_Transmit(&huart1, &chr, 1, 10000); for(uint16_t i = 0; i < 3000; i++) {
for(uint16_t j = 0; j < 3000; j++) {
test();
}
}
HAL_UART_Transmit(&huart1, &chr, 1, 10000);
while(1)
{
HAL_Delay(100);
}
}
start.cpp
#include "start.h"
#include "main.h"
using namespace std;
extern UART_HandleTypeDef huart1;
uint8_t ii;
class Base
{
uint8_t a = 0xff;
public:
virtual void fun() {
ii = '0';
//HAL_UART_Transmit(&huart1, &ii, 1, 10000);
}
};
class Child :public Base
{
uint8_t b = 0x55;
public:
void fun() {
ii = '9';
//HAL_UART_Transmit(&huart1, &ii, 1, 10000);
}
};
void test()
{
Base parent;
Child child;
Base *p = &parent;
p->fun();
p = &child;
p->fun();
}
void startup()
{
uint8_t chr = '+';
HAL_UART_Transmit(&huart1, &chr, 1, 10000);
for(uint16_t i = 0; i < 3000; i++) {
for(uint16_t j = 0; j < 3000; j++) {
test();
c语言和c++区别
}
}
HAL_UART_Transmit(&huart1, &chr, 1, 10000);
while(1)
{
HAL_Delay(100);
}
}
这⾥两边都使⽤了全局变量ii,是由于如果使⽤局部变量O1会优化掉start.c⽂件⾥的两个fun函数。编译出来的⽂件⼤⼩
c为4808,c++为4888,再考虑到c++多了个retarget.c⽂件,基本可以说⼤⼩差距可以忽略不记了。
内存占⽤情况
C
好像O1将函数优化掉了,我这没见着具体的内存地址但根据c的原理,很容易猜测出其内存分布
C++(0x20000878为parent的地址)
从这可以看出c++会多⼀个虚表指针,⽽c则会按设计struct结构分布。就占据栈的⼤⼩来来看,两边都差不多。
运⾏效率
运⾏效率通过计算两次串⼝打印的时间差,来获取其时间开销
C 花费1.714s
C++ 花费5.145s
简单估算⼀下C++耗时⼤约是C的3倍,考虑到虚函数开销情况(多⼀次整形加法和⼀次指针间接引⽤),需要花费3倍时间也处于可以接受范围。
总结
从编译出的⽂件⼤⼩,内存暂⽤情况,运⾏速度可以看出,这种仅使⽤c++类来处理c中模型对象问题的⽅法完全⾏得通,这种⽅法应该能显著的提⾼c处理⾯向对象类型问题的效率,如有类似的开发需求完全值得⼀试。
附:
1.这⾥没使⽤O0是因为⽆论是c还是c++都进不了main函数,这⾥并没有进⼀步研究
2.C++使⽤STL容器⼤⼩明显增⼤,我这⾥尝试添加string,⼤⼩从5k增⼤到65k,所以要⽤c++⾥的功能尽量按需⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。