|
发表于 2018-12-26 07:07:47
|
显示全部楼层
我不需要你信,我只要你服。我给个例子,请您自己测试。另外,请认真看我6楼和9楼的文字,不要断章取义,我说的是相对于printf、scanf系函数来说,C++更快,因为无需参数判断过程。MDK 4.73下编译,STM32F103C8T6,Heap设为0,Stack设为0x200。
- // C版本 sprintf函数,结果:Program Size: Code=700 RO-data=252 RW-data=0 ZI-data=512
- int main() {
- char s[50];
- sprintf(s, "Hello, %s, 3 + 3 = %d\r\n", "Boy", 3 + 3);
- }
复制代码- // C++版本 自定义了一个类,暂时只支持整数和字符串,想支持更多,自己往里面塞,什么都可以。结果:Program Size: Code=336 RO-data=252 RW-data=0 ZI-data=512
- class StrPrint {
- private:
- char* ptr;
- public:
- inline StrPrint(char* InplaceStr) : ptr(InplaceStr) {
- ptr[0] = '\0';
- }
-
- inline StrPrint(char* InplaceStr, char* Str) : ptr(InplaceStr) {
- strcpy(ptr, Str);
- }
-
- inline StrPrint& operator = (const char* Str) {
- strcpy(ptr, Str);
- return *this;
- }
-
- inline char* c_str () {
- return ptr;
- }
-
- inline void Clear() {
- ptr[0] = '\0';
- }
-
- inline int Length() const {
- return strlen(ptr);
- }
-
- inline StrPrint& operator << (const char* Str) {
- strcat(ptr, Str);
- return *this;
- }
-
- // 哎,我的MDK不支持itoa,只支持atoi,只好自己搞了,杯具
- inline StrPrint& operator << (int n) {
- char s[16];
- int i,j,sign;
- if((sign=n)<0)//记录符号
- n=-n;//使n成为正数
-
- i=0;
- do {
- s[i++]=n%10+'0';//取下一个数字
- } while ((n/=10)>0);//删除该数字
-
- if(sign<0)
- s[i++]='-';
-
- int k = Length();
- for(j=i - 1; j>=0; j--)//生成的数字是逆序的,所以要逆序输出
- ptr[k] = s[j], k++;
-
- ptr[k] = '\0';
-
- return *this;
- }
- };
- int main() {
- char ss[50];
-
- StrPrint str(ss);
- str << "Hello, " << "Boy" << ", 3 + 3 = " << 3 + 3;
- }
复制代码
效率我就不比较了,你自己实际跑一跑。我还贴个反汇编,你给指导指导:
我为什么要把"Hello, "、"Boy"、", 3 + 3 = "分开来呢,就是怕你抬杠,反汇编里你可以看到,实际上对应的都是strcat。
当然这个类还可以更高效,不用另外声明字符串,但是要用到模板,我就不贴了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|