![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++语法反汇编
文章平均质量分 50
文弱书生666
多总结,多复盘
展开
-
创建自己的sdk
下面操作只能保证项目知道去哪里找了,但是不知道具体找哪个(这就需要个人设置)右键class出来这个界面,在里面勾选静态库(.lib)头文件如下,namespace可以写在头文件里面声明。代码如下,我们要将其封装为一个sdk供别人安装使用。截下来演示怎么导入到另一个项目中。将那两个文件移到那个文件夹中。我们拿到生成的这两个文件了。要把造轮子当作一种享受。原创 2024-06-05 00:04:13 · 193 阅读 · 0 评论 -
头文件和源文件的一些情况分析
函数和变量的声明可以有多次,但是定义只能有一次其实头文件可以写函数的定义,但是在工程里面很多人引用这个头文件很容易造成重复定义的情况//2.h//1.cppreturn 0;重复定义了```这中间写想只被编译一次的内容这个方法也可以控制软件的版本。原创 2024-06-04 23:47:40 · 344 阅读 · 0 评论 -
从编辑器角度来理解定义和声明
报错,在函数里面(包括int main函数)extern声明会和定义冲突。下面这种写法就很ok。原创 2024-05-13 18:42:33 · 224 阅读 · 0 评论 -
inline和static底层浅析
找一段代码来底层分析反汇编结果为没有给参数压栈了,而是直接给了一个结果三,提高了代码的效率。原创 2024-05-13 16:01:39 · 235 阅读 · 0 评论 -
函数模板底层本质
数组(详情请看那一篇文章)大小不一样也重新生成函数。就算非类型参数值不一样编译器也重新生成函数。模板本质是编译器帮忙生成了不同的函数。原创 2024-05-13 00:41:42 · 136 阅读 · 0 评论 -
auto->decltype
a++等价于a,a++是要当a被用过(这里面要被decltype用过)才++,所以先decltype,所以直接为int类型。++a(等价于a = a+1,这个表达的值就是a+1)相当于经历了运算,又有&a这个固定地址,所以为int&引用类型。是没有固定地址的,是暂存在寄存器中的,所有这个类型直接为int(就算为int& + int&)声明变量别用auto,auto是让编辑器来自己推断,很影响运行效率。c++11标准才有的,c++14丰富了很多这个相关的用法。因为(a+b)/2没有固定地址所以是int类型。原创 2024-05-12 00:06:41 · 380 阅读 · 0 评论 -
函数重载和函数模板
c语言中函数名字不可重复,但是可以写代码实现。原创 2024-05-11 23:13:12 · 338 阅读 · 0 评论 -
函数指针的使用
函数名的本质就是内存地址。原创 2024-05-11 22:21:31 · 181 阅读 · 0 评论 -
传参右值引用的好处
左值有明确的内存空间,右值无明确的内存空间,230+300是没有正式的地址的,一般是临时找一个寄存器暂存,不放栈中。本质就是说右值引用可以不用占用宝贵的栈空间,而是自己找一些犄角旮旯存(一些寄存器)有时候需要临时变量来测试,这种返回结构体的行为太浪费栈空间了。和常量左值引用不同的是,右值引用还可以对右值进行修改。这是将230+300的值临时放在eax寄存器中。目前这个地方还是一知半解,需要深入学习汇编知识。右值不代表在右边,左值不代表在左边。于是可以采用右值引用来节省栈空间。原创 2024-05-09 00:09:35 · 164 阅读 · 0 评论 -
c++函数返回指针和引用
写不了,我们把指针指向了这个常量区,看似拥有了,其实不属于str我们需要把常量字符拿出来,让指针指向栈区或者堆区结果依然出错,因为strRt这个字符数组为局部变量传不出来解决办法2-将char数组定义为全局变量现成的字符串复制函数strcpy但是strcpy是不安全的编译器会报warnning两种方法可以解除法一:法二:没得任何警告如果str1用new来创建时,就会报错这是因为strcpy_s()函数是有两个版本,用两个参数、三个参数都可以,只要可以保证缓冲区大小。三个参数时:两个参数原创 2024-05-07 00:36:12 · 268 阅读 · 0 评论 -
函数的引用参数
但是Acter和BeAct是局部变量,我可以通过Acter和BeAct指针改变Acter和BeAct结构体里面的具体字段值,但是不能让user指向prole,prole指向user,二级指针可以办到,但是太繁琐了,可以采用指针的引用。直接报错,运行都运行不了,因为引用的本质是指针,不能把int类型的指针指向float一样的道理。形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作。原创 2024-05-04 15:49:15 · 235 阅读 · 0 评论 -
string底层浅析
char简单易用,但是string是万金油。原创 2024-05-04 15:30:14 · 176 阅读 · 0 评论 -
结构体反汇编解析
原因:只有在定义这个结构体变量时候,编译器就去看这个结构体的定义,然后结构体都是基础数据类型组成的,占用内存的大小都是确定的,所以可以通过偏移来访问结构体的成员。如果是地址就是采用箭头,箭头是偏移的意思,就像x86内核要取出寄存器的信息,定义一个结构体,然后用偏移来访问各个寄存器的值。可能是现在vscode编辑器的优化,把一些压栈的操作给忽略了,所以更加直白一些。,这是将在堆中创建了两个int变量,然后puser指向第一个int变量。发现在定义结构体的部分是没有汇编代码的。实体取出值就是按点(.)来访问。原创 2024-04-30 23:14:46 · 108 阅读 · 0 评论 -
const栈常量反汇编解析
查阅了钱林松老师的第62面,解释了#define和const的区别,const修饰的栈常量是伪常量,最终是一个变量,只是在编译期间对语法进行了检查,发现有对const变量存在直接修改行为则报错,所以const修饰的栈常量本质是可以修改的。其实a那个地址的内存单元已经被修改成了9500,只不过是在编译时候,把a的值的位置都替换成了1000,所以汇编时候那个位置都是1000,在反汇编时候,发现直接是把3E8h直接移到了edx中。我们分析一下反汇编代码。原创 2024-04-30 19:37:21 · 185 阅读 · 0 评论