
c/c++的语法的汇编解释
zhangzhangkeji
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
讨论 c / c++ 语言里的 do...while 循环里的 continue 跳转的位置, 并用反汇编查看一下,结果是会先进行条件判断的,再进行循环
(1)(2)原创 2025-02-20 20:43:13 · 100 阅读 · 0 评论 -
c++ 定点 new 及其汇编解释
【代码】c++ 定点 new。原创 2025-01-28 14:57:16 · 490 阅读 · 0 评论 -
c++ 里 常量转换 const_cast < T > ,要给模板参数 T 传递什么类型呢?
【代码】c++ 里 常量转换 const_cast < T > ,要给模板参数 T 传递什么类型呢?原创 2024-12-28 03:08:21 · 277 阅读 · 0 评论 -
c++ : 已知 int a =5 ; int & b = a ; 那么 &b ,对左值引用取地址会返回什么呢?
这取决于 c++ 编译器定义的语法规则,看采取哪种语义。(1) 问题如标题。原创 2024-12-23 03:47:08 · 155 阅读 · 0 评论 -
c++ 中,当函数的返回值是左值引用时 ,接收函数返回值的变量是否也是左值引用呢?答案为不是
(3)接着给出 c++原创 2024-12-10 13:53:24 · 233 阅读 · 0 评论 -
c++ 里重解释转换之于引用 reinterpret_cast< long& >
今天遇到了这一很新奇的写法。模糊中记得王老师也这么讲过。c++ 里四大转换。把数据重解释为原来数据的引用。虽然也可以直接定义对变量的引用。原创 2024-05-27 20:09:05 · 175 阅读 · 0 评论 -
vs2019 c++ 对左值引用取地址得到的是谁的地址?
(2) 用反汇编看一下,为了代码容易看懂,改一下源代码,不使用 cout 这个复杂的对象;对左值引用取地址,返回的地址是其引用的变量的地址,而非自身的地址。原创 2024-05-14 00:08:24 · 189 阅读 · 0 评论 -
探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别
(1)咱们可以用 decltype () 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量,却行不通。所以函数类型只有语法意义。但在使用上没有函数指针有用。例如上面的 Fun 类型,没有构造函数等成员函数,啥用没有。原创 2024-05-11 19:39:46 · 230 阅读 · 0 评论 -
vs2019 STL库里 判断函数类型的模板 is_function_v 与 is_const_v
经简单代码测试后,得出 vs2019 的 c++ 编译器 和 其 STL 库的观点与设计:is_const_v 用来判断类型 T 内是否含有 const 修饰符,含有 const 则返回真。,可以被 is_function_v 用来筛选函数类型。给函数类型加上 const 修饰,感觉语义上无法理解,但编译并不报错。所以 STL 库对函数类型的筛选不是通过定义,是通过间接的排除法。原创 2024-05-11 19:07:22 · 287 阅读 · 0 评论 -
关于 vs2019 c++ 20规范,STL 库提供的标准分配器 alloctor 及其 traits 及涉及分配器交换的全局函数 _Pocs
对于两个 list 链表,使用的默认的分配器将都是 STL 中的类, allocator。意思是不支持对象交换。相当于 两个 list 对象交换时不必交换分配器,因为它们使用的是相同的分配器。(1) 我们写 c++ 代码,使用 STL 库中的模板,很少自己写对象的分配器。研究 STL 中的分配器也可以为咱们自己写分配器提供参考。咱们会遇到这样的场景,例如交换两个容器对象: list a ,b;其中使用了全局函数 _Pocs ,其进行俩 list 对象的分配器的交换。可见,跟咱们的预想是一致的。原创 2024-05-10 03:17:48 · 405 阅读 · 0 评论 -
关于 c++ 中字符串 string 及 常量字符串的换行与使用
(1)例如 cout << " ddddddddddddddddddd"。当输出字符太长,就需要换行。疑问是如何写代码,才可以保证源代码中的字符串换行被正确编译呢?测试一下,如下图可见,如此换行,源代码中的字符串可以被正确编译。原创 2024-05-08 16:47:14 · 560 阅读 · 0 评论 -
关于vs2019 c++ STL 中容器的迭代器的 -> 运算符的使用,以 list 双向链表为例
对于 STL 中提供的迭代器,提供了类似于指针的功能。对迭代器也可以使用 -> 运算符来访问容器中元素对象里的成员。可见 ,pointer_to 只是解析了其形参的内存地址。对于全局函数 addressof 就不再展开了,见名知意,就是求形参的地址。(1)如下的结构体 A ,若有指针 p = new A();则可以使用 p->m , p->n 解引用运算符。这也符合我们对指针的理解。只要通过指针拿到了对象的首地址,就可以用偏移量来访问类对象中的各个数据成员和函数。原创 2024-05-08 04:39:47 · 335 阅读 · 0 评论 -
关于c++ 中 string s { ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ } 的方式的构造过程
(1)这样的构造方式不常见,但也确实 STL 库提供了这样的构造函数。(2)以反汇编分析这行代码。原创 2024-05-07 23:30:56 · 249 阅读 · 0 评论 -
再以汇编代码分析c++的右值引用
可见,右值引用其实还是引用, bb 和 cc 都是对 aa 的引用,其内存里存储了 aa 的地址。同样是调用std:: move() ,但汇编代码中,对参数类型的不同,编译结果是不同的。此种情况常见于函数中参数的传递。见王建伟老师《模板与泛型》里的完美转发。而且还有一个很奇特的现象,bb无法给cc赋值,右值引用无法给右值赋值。汇编分析c++语言的执行结果最为准确。原创 2023-06-25 15:14:26 · 335 阅读 · 0 评论 -
static_cast<T>(m) 的汇编解释
该静态类型转换,可以把当前类型 m 转换成 T 类型的对象值,其实该静态转换,编译器处理为调用对象 m 的 类型转换函数 , operator T (){}为什么研究这个函数呢?因为在 std :: move() 函数里,也有其调用。原创 2023-06-08 18:13:36 · 113 阅读 · 0 评论 -
typeid(),dynamic_cast<>都与虚函数表的-1项有关
好不好,对于类含有虚函数,在生成此类对象时会插入指向虚函数表的指针。虚函数表里保存了各个虚函数的入口地址。但是在vs2019上反汇编验证,虚函数表的第-1项,也是一个指针,指向该对象的类型信息,能关联到该类的type_info对象。这个对象是编译时写入程序文件的,通过type_id函数可以返回对该对象的引用。动态类型转换,其实也会通过虚函数表的第-1项访问到这个类型对象,以确定是否可以进行动态转换。但结论是仍然验证了,在vs2019上,虚函数表的第-1项,也是一个指针,指向该对象的类型信息。原创 2023-06-08 16:07:00 · 85 阅读 · 0 评论 -
左值引用、右值引用,std::move() 的汇编解释
如图,c++ 对右值引用的处理是为这个只有值的常量分配内存,在其中存储常量的值,并把地址传递给右值引用。而且可见,左右值引用,存储的都是变量的地址,类似于指针。左值引用的必须具有内存地址,右值引用必须具有值,不能具有地址,比如常量。该函数的定义如下:其参数是右值引用,返回值还是右值引用,找重点,静态转换的函数先少考虑,一会看汇编,看结果。所以结论是:左值引用,右值引用存储的都是变量的地址,都是我们熟知的引用,没有发生语义的变化。以上就是左值引用,引用的必须是具有内存地址的对象,因为要完成引用初始化。原创 2023-05-14 00:02:17 · 707 阅读 · 1 评论 -
NULL 与 nullptr
可见NULL 与 nullptr 是不同类型,书中建议用新的 nullptr 在c++ 中全面替代 NULL,以防作为参数时的类型转换,和调用重载函数时的选择错误。原创 2023-04-22 15:34:17 · 138 阅读 · 0 评论 -
const修饰的常量真的不能被改变值么?
如图,通过地址(引用本质上仍然是地址),可以绕开const语义给常量赋值。但这是运行阶段的事。编译阶段生成机器指令时候,已经在指令里引用了常量值。所以,常量值是不可改变的。原创 2023-04-22 14:51:31 · 144 阅读 · 0 评论 -
函数重载的验证
编译器里有函数签名之说。可以根据函数的参数不同,进行区分,内部合成不同的函数名称,对应不同的函数地址。原创 2023-04-22 01:13:36 · 70 阅读 · 0 评论 -
函数参数带默认值的汇编解释
可见,形参带默认值,也是编译器提供的语法糖。编译器根据你传参的实际情况,决定最终的所有实参的值,你提供了值,用你的值,你没提供值,用默认值,再 call 指令去执行函数。不是函数强大,是编译器强大。原创 2023-04-21 23:45:45 · 74 阅读 · 0 评论 -
常量引用const int & a = 10
引用只能引用至变量上。但如图的语法也可以引用到常量上。其实质是在函数局部数据区分配一个无名变量,存储了 10 ,再将其地址引用给 a。原创 2023-04-21 23:15:51 · 198 阅读 · 0 评论 -
c++函数中静态局部变量static的汇编语义
可见,对静态变量赋值的语句,并没有出现在函数 f 的汇编代码里。变量 a 应该定义在全局数据区,但编译时符号表描述了它的访问权限,仅在函数 f 内可以访问。没有初值,则编译器给它赋值为默认值。所以实现了一次赋值,多次引用,一直存在。原创 2023-04-21 22:49:18 · 129 阅读 · 0 评论 -
c++引用的汇编解释之引用
用vs2019反汇编以上代码,可见对变量指针和变量引用的汇编代码是一样的。引用和指针都是变量,占用内存,并保存一个地址。c++多增加一个引用,可能是为了回避指针的赫赫威名。熟练的话,直接用指针不也行么?当然,用引用的代码编辑,可以少写个 * 号了。原创 2023-04-21 21:17:00 · 107 阅读 · 0 评论