![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CPU底层
文章平均质量分 59
"dandan"不能定义
一切特立独行的人格都意味着强大!!
展开
-
CPU底层那些事(数组越界也不一定就会出现堆栈溢出)
数组作为一种数据类型。数组越界会咋样?会导致堆栈溢出吗?其实数组越界分两种,一种是数组向高端地址越界、一种是数组向地段地址越界。1.数组向低端地址越界。(1)定义一个数组,并依次给数组赋值。代码:#include <stdio.h>#include <windows.h>void fun1(){ long a[2]; a[0] = 1; a[1] = 2; a[-1] = 3; a[-2] = 4;}int main().原创 2022-04-14 16:00:05 · 1146 阅读 · 3 评论 -
CPU底层那些事(指针你知道多少?)
C和C++的精髓是指针,指针的本质是内存地址。普通变量或者类的成员变量都有内存地址,普通变量或者类的成员变量能像指针变量一样使用指针操作。(指针的*操作和->操作)。1.定义一个普通的变量a,fun1()函数:借用指针变量p,通过*操作,给变量a给赋值。代码:int a = 0;void fun1(){ int* p = &a; *p = 1;}底层汇编:a: .zero 4fun1(): push rbp .原创 2022-04-13 11:31:02 · 1149 阅读 · 4 评论 -
CPU底层那些事(goto的优势)
底层看goto和for循环goto真的消失了吗?其实并没有,他只是以另一种形式在存在而已。从上述图片中,我们可以看到,for循环和goto的底层汇编指令完全相同。总结1.jmp这个指令,用来改变cpu执行指令的位置。2.通常情况下,CPU都是顺序执行,一条指令执行完,在执行下一条指令。遇到jmp指令后,cpu就会跳转至被指定的位置,继续执行。3.这种改变程序执行顺序的情况有很多,比如:for,while,foreach,if(){}else{},switch。你完全可以用goto实现该原创 2022-03-22 18:11:32 · 852 阅读 · 5 评论 -
【CPU底层那些事(数组和指针真的一样吗?)】
1.对数组的理解从上述简单的数组赋值,及其底层代码可以看出,数组赋值过程其实就是对一段连续的内存赋值。int是四个字节,每个元素的地址间隔都是四个字节。char是一个字节,每个元素的地址间隔都是一个字节。从上述我们就知道数组在内存中的样子。看到连续的内存就想到了指针。只要知道数组a的首地址和数组长度,就可以准确定位数组在内存中的空间位置。如下图所示。2.数组和指针之间的关联void fun1(int a[2]){ a[0] = 1; a[1] = 2;}void原创 2022-03-17 14:08:29 · 463 阅读 · 1 评论 -
【CPU底层那些事(二进制陷阱)】
1.a == 0xFF??为啥不相等1.为了实现比较,编译器一般会先统一类型。一般会统一为int类型。2.对于char a = 0xFF;a实际等于十进制的-1,转换为int类型还是-1.3.if(a == 0xFF) ,此时a是-1,十六进制表示为0xFFFFFFFF;而0xFF,我们无法确定它的类型,只要不是char类型,表示的十进制数就是255.是0x000000FF。十进制为if(-1 == 255);十六进制为if(0xFFFFFFFF == 0x000000FF);因此,不管是十原创 2022-03-17 11:59:51 · 872 阅读 · 2 评论 -
【CPU底层那些事(底层视角看i++ VS ++i)】
底层视角查看i++ 和 ++i谁更快?1.例程11.1 编写两个函数进行对比void func_1(){ int i = 1; ++i;}void func_2(){ int i = 1; i++;}1.2 对应的底层汇编func_1(): push rbp mov rbp,rsp mov DWORD PTR [rbp-0x4],0x1 add DWORD PTR [rbp-0x4],0x1 nop pop r原创 2022-03-14 12:01:14 · 905 阅读 · 0 评论 -
【CPU底层那些事(左值VS右值)】
1.对左值和右值的理解int i = i+1;左值用于写操作,可以存储数据;右值用于读操作,读到的数据放在一个看不见的临时变量i = i+1;mov eax,DWORD PTR [rip+0x2f1c] # 40402c 对于第一条汇编指令,执行的是右边,读取变量i的值,并存放在程序员看不见的“临时变量”,寄存器eax中。add eax,0x1对于第二条汇编指令,对临时变量进行加1的操作,将结果2,存放在“临时变量”,寄存器eax中mov DWO原创 2022-03-14 11:12:39 · 508 阅读 · 2 评论 -
CPU底层那些事(CPU如何读写变量)
cpu如何读写变量原创 2022-03-13 13:43:05 · 843 阅读 · 1 评论 -
CPU底层的那些事(main函数)
1.在线编译器**推荐一个可以方便查看汇编代码的在线编译器:左边源代码,右边源代码对应的汇编指令和字节码(在线编译链接:https://godbolt.org/)**2.main函数和普通函数的区别#include <stdio.h>int main(){ printf("heello,world"); return 0;}结论:main函数编译成功!#include <stdio.h>int func(){ printf("heello,world原创 2022-03-11 17:38:34 · 1091 阅读 · 0 评论