![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
文章平均质量分 61
巩固C/C++基础,望大家早日达到“精通”
Rookie Linux
物联网工程专业
展开
-
C/C++性能提升之cache分析
0方式的 cpu_core/L1-dcache-load-misses/ 是36,246 , cpu_core/L1-dcache-load/ 是848,148,941,命中率为0.999957265。1方式的 cpu_core/L1-dcache-load-misses/ 是38,540 , cpu_core/L1-dcache-load/ 是848,192,764,命中率为0.999954562。所以我们写代码时应该多注意对齐、以及cache这些问题,感兴趣的同学还可以多试试不以64对齐的情况。原创 2023-06-04 23:25:58 · 1349 阅读 · 0 评论 -
C++定位new用法及注意事项
虽然对象1及3的空间被回收,但对象1与3并未析构!2.在使用delete回收空间时,可以发现并未回收pc1与pc3,其原因在于pc1与pc3指向的对象位于内存缓冲区,该空间并不是定位new申请,而是常规new申请的,因此我们需要delete[]回收内存缓冲区,而不是delete pc1与delete pc3。显然,如果类动态地为其成员分配内存,这将引发问题!1.使用定位new创建的对象的地址与内存缓冲区地址一致,说明定位new并没有申请新空间,而构造函数的调用说明定位new的确调用了构造函数。原创 2023-02-12 14:19:43 · 881 阅读 · 0 评论 -
C++虚析构函数的用法
可以看到,第三种情况下执行的只有基类的构造函数,子类的构造函数并为执行,如果子类的析构函数中有释放堆的操作,那这样便有内存泄露了。一般用在有继承关系的情况下,比如多态。原创 2023-02-11 21:58:35 · 124 阅读 · 0 评论 -
C++中的强制类型转换
如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。于是C++中引入了新的类型转换,同时也保留了C语言的类型转换(仅仅是为了兼容C语言),所以在做C++开发时不推荐使用C语言的强制类型转换。数值问题:比如一个float类型的数据转换为short数据时,肯定会有精度损失(当被转换变量的值超过short的范围)将一个父类指针转换为子类指针,然后我们再操作时访问子类独有的成员时,这很有可能就会出错(比如段错误或者值不对)除此之外,比如没有内存检测(数字转化为地址类型)等。原创 2023-02-11 21:47:29 · 1088 阅读 · 0 评论 -
排序算法(三) 快速排序
#include <stdio.h> int a[101],n;//定义全局变量,这两个变量需要在子函数中使用void quicksort(int left,int right){ int i,j,t,temp; if(left>right) return; temp=a[left]; //temp中存的就是基准数 i=left; j=right; while(i!=j) { //顺序很重要,要先从.原创 2021-10-24 23:28:26 · 1980 阅读 · 0 评论 -
排序算法(二) 冒泡排序
上一节讲述了最简单快速的排序算法——桶排序,桶排序算法有一个很要命的缺点是浪费空间,相反,它的时间复杂度为O(M+N),是一种空间换时间的策略关于桶排序算法参照博文:https://blog.csdn.net/qq_37120369/article/details/118916335上一节使用桶排序算法排序的是整数,如果现在需要排序的不再是整数而是一些小数,比如将 5.56789,2.12,1.1,3.123,4.1234 这五个数进行从小大排序又该怎么办呢?现在我们来学习另一种新的排序算法:冒原创 2021-07-22 01:28:41 · 130 阅读 · 1 评论 -
排序算法(一) 最快最简单的排序算法——桶排序
在生活中,到处都存在排序,比如考试排名、价格排序等下面以成绩排序为例子学习桶排序算法1、问题描述现有5个同学,成绩分别是5分、3分、5分、2分、8分(满分10分),按照从大到小排序后是8 5 5 3 2,请用一段程序实现这个问题。2、解决思路首先我们需要申请一个大小为 11 的数组 int a[11]。OK ,现在你已经有了 11 个变量,编号从a[0]~a[10]。刚开始的时候,我们将 a[0]~a[10]都初始化为 0,表示这些分数还都没有人得过。例如 a[0]等于 0 就表示目前还翻译 2021-07-20 00:27:23 · 613 阅读 · 0 评论 -
C语言到C++的升级
一、变量定义的升级C++中所有变量均可以在使用的时候再定义;C语言中,所有变量必须先定义再使用(在作用域开始的位置定义)。例如:for(int i = 0;i < 10; i ++){ printf("%d\r\n",i);}在C++这种写法是合法的,而在C语言中编译时会报错二、register关键字升级register关键字是请求编译器将局部变量存储在寄存器中,从而提高效率(现代编译器优化已经做的很好了,所以实际工程中很难看到这个关键字)在C语言中,无法原创 2021-06-30 21:42:33 · 331 阅读 · 1 评论 -
C语言字符串典型问题
例程 1#include <stdio.h>int main(){ char buf[10] = {0}; char src[] = "hello %s"; /* snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...) 将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。 */ snprintf(buf,sizeof(b原创 2021-06-10 21:09:13 · 293 阅读 · 1 评论 -
C语言实现内存泄漏检测模块
实现检测模块/*文件 mleak.h*/#ifndef _MLEAK_H_#define _MLEAK_H_#include <stdio.h>#include <malloc.h>#define MALLOC(n) my_malloc(n,__FILE__,__LINE__)#define FREE(p) my_free(p)void * my_malloc(size_t n,const char* file,const int line);void m原创 2021-06-02 23:08:35 · 352 阅读 · 1 评论 -
C语言“#pragma”的那些事
#pragma用于指示编译器(预处理阶段)完成一些特定的动作,它有以下特性1、#pragma在不同的编译器间是不可移植的,预处理器会忽略它不认识的#pragma指令2、不同的编译器可能会以不同的方式解释同一条#pragma指令一般用法:#pragma 参数常见的参数有message once packmessage用法:用于在预处理时提供打印版本信息,大多数编译器都有相同的实现#if define(CPLUSPLUS17)#pragma message("C++ versi...原创 2021-06-02 00:11:51 · 818 阅读 · 10 评论 -
C程序中变量等内存布局(二)
之前写过几篇关于C语言内存相关的文章,现在对之前的知识点进行补充https://blog.csdn.net/qq_37120369/article/details/104349078https://blog.csdn.net/qq_37120369/article/details/109553140以Linux下的C程序为例,C程序用gcc编译器默认编译生成名为a.out可执行程序,当我们使用./a.out执行可执行程序时操作系统加载这个可执行程序,产生一个进程。图一为代码在可执行程序中原创 2021-04-11 11:39:10 · 183 阅读 · 1 评论 -
C语言野指针讲解
在实际工程开发中经常会听到“野指针”,那么问题来了,什么是野指针?野指针有什么危害?在介绍野指针之前,先了解一点,指针变量的本质是值,只不过这个值有点特殊,是一个内存地址值“野指针”指的是指针变量中的值是非法的内存地址,但“野指针”不是空指针(NULL),“野指针”指向的内存是不可用的,“野指针”往往会造成内存越界、段错误等问题补充:合法的内存地址包括定义的变量的地址、malloc函数申请堆内存返回的地址(但未使用free释放)介绍过“野指针”的概念后就该了解一下“野指针”的由来,这样.原创 2021-03-14 01:43:04 · 6315 阅读 · 3 评论 -
C语言作用域、生命周期及static关键字学习
很久以前写过一篇关于C语言程序内存分布的博客https://blog.csdn.net/qq_37120369/article/details/104349078现在,再对之前的一些知识进行补充一、作用域:全局变量的作用域有两种情况:1、全局作用域在程序的各个角落都可以访问到2、文件作用域只在当前代码文件中访问并使用局部变量的作用域只在对应“{}”内有效二、生命周期:全局数据区中变量的生命周期从程序运行开始到程序销毁栈空间中变量的生命周期从进入作用域开始到离开作用域销毁原创 2020-11-07 22:50:09 · 546 阅读 · 2 评论 -
C++的string与char* char[]相互转换
这俩天忙着调试一块AD芯片,突然想起今天是程序员日,嗯,也不知道写点什么,那就随笔写点这段时间看的C++吧C++与C语言中最常见的就是字符串了,因此,关于它们自己的转换什么就尤为最重要了首先C++中的string可以被看成是以字符为元素的一种容器一、string 转const char*string有2个函数:一个是.c_str(),一个是data成员函数。其中c_str()确保返回的字符串以‘\0‘结尾,而data不能确保二、string转char*可以用string的一个..原创 2020-10-24 22:47:48 · 4592 阅读 · 2 评论 -
C程序中变量等内存布局(代码段,数据段等)
我们都知道一个c语言程序可能会包含.text(代码段)、 .data(数据段)、 .rodata(只读数据段)、 .bss(未初始化段)等,为了搞清楚不同变量的存放位置,我们做一些实验,最后再得出结论首先我们写一个简单的c语言测试程序,命名asm.c#include <stdio.h>#include <string.h>#define N 10int ...原创 2020-02-16 22:45:42 · 791 阅读 · 0 评论 -
嵌入式ARM中常用的汇编指令讲解
在介绍之前,先把ARM中常见的寄存器及其别名截图,如下:其中的r1,r2,r3常用作传递参数,r4至r11保存局部变量,r13常用作数据栈指针,别名sp;r14寄存器称作连接寄存器,别名lr,常用保存子程序返回地址;寄存器r15是程序计数器,别名pc(1)相对跳转指令:b、bl 这俩条指令的不同之处在于bl指令除了跳转之外,还将返回地址(bl的下一条指令的地址)保存...原创 2019-12-17 20:10:14 · 3100 阅读 · 0 评论 -
C/C++中的指针函数与函数指针,以及函数指针在回调函数和函数指针数组中的应用
首先,我们先要明确一点,函数指针是一个指针,只不过这个指针指向的对象有些特殊,是一个函数。指针函数是一个函数,只不过函数的返回值是一个指针。一、指针函数,指针函数的一般定义格式是:类型* 函数名(形参列表){ 语句块; return 返回值;}举个例子如下:#include<stdio.h>#include<st...原创 2019-11-22 17:18:08 · 359 阅读 · 0 评论 -
C语言中结构体变量的定义及引用
一、结构体变量的定义1.结构体类型与结构体变量分开定义一般形式如下:struct<结构体名><结构体变量名>;eg:struct student student1,student2;关键字struct要与结构体名student一起使用,共同构成结构体类型名2.结构体类型与结构体变量同时定义一般形式如下:struct<结构体名>...原创 2018-08-08 16:05:24 · 48894 阅读 · 0 评论