随笔分类 -  gcc源码分析

1 2 下一页

g++如何判断>>是模板结束还是右移操作符
摘要:intro 在使用模板声明中,有一个经典的问题就是如何区分模板声明中的">>"是右移操作符还是一个模板声明的结束标志。好在新的C++标准削弱了这个很强的限制,而是允许reasonable的、根据上下文对符号进行不同的解析。 C++11 improves the specification of th 阅读全文

posted @ 2024-09-07 16:28 tsecer 阅读(7) 评论(0) 推荐(0) 编辑

从__builtin_eh_return看callee saved register
摘要:问题 C++的异常处理看起来是一个比较神奇的功能,能够在运行时穿越堆栈,从异常发生位置直达异常处理位置。通过gcc的代码可以看到,这个堆栈回溯的一个关键步骤是这个宏,其中又使用了gcc的内置指令__builtin_eh_return。网上关于__builtin_eh_return这个内置函数的资料较 阅读全文

posted @ 2024-03-04 20:19 tsecer 阅读(63) 评论(0) 推荐(0) 编辑

make是不是go的关键字
摘要:keyword go语言介绍中标榜的一个重要特点是语法简单,这里有一个不同语言关键字的个数,同样是为了防止网页打不开或者丢失,这里单独复制一份: C (ANSI (C89)) (32 keywords) C (C11) (44 keywords) C (C17) (44 keywords) C (C 阅读全文

posted @ 2023-11-09 20:33 tsecer 阅读(10) 评论(0) 推荐(0) 编辑

gcc对构造函数的调用生成
摘要:identifier C++的前端对identifier做了扩展,在每个identifier中还包含了两个cxx_binding字段:namespace_bindings和bindings。当通过字符串找到一个identifier的时候,同时顺带获得了两个binding信息。 /* Language 阅读全文

posted @ 2023-10-19 20:58 tsecer 阅读(55) 评论(0) 推荐(0) 编辑

gcc为函数生成指令内为什么会有多处return
摘要:函数返回 如果一个函数的返回点比较多,而且函数比较长,想通过调试器知道函数从哪个位置退出就会比较麻烦。有些资料说一般编译器的所有return最终会经过同一条ret(机器指令)返回,所以只要找到该指令的位置打断点即可。这个对于没有开优化的指令可能是正确的,开启优化生成的二进制中经常可以看到一个函数内有 阅读全文

posted @ 2023-04-13 21:35 tsecer 阅读(80) 评论(1) 推荐(0) 编辑

C++标准对于大括弧初始化的规定及gcc的对应实现
摘要:问题 在初始化一个类的时候,在某些情况下,希望先初始化对象的一个字段,然后其它字段根据这个已经初始化的字段再初始化。简单来说,就是类似于这种初始化调用想精简一下 struct A { int x, y; }; int tmp = foo(); A a{tmp, tmp + 10} 这种形式,是否可以 阅读全文

posted @ 2023-03-18 15:44 tsecer 阅读(42) 评论(0) 推荐(0) 编辑

使用emplace_back的new initializer expression list treated as compound expression提示看聚合初始化和parameter pack
摘要:测试代码 使用emplace_back可以避免不必要的构造和拷贝,而是直接在向量的内存位置执行construct进行构造,代码看起来也更加简洁。 但是在使用的时候,会发现有一些和直观不太对应的情况。例如,在下面的例子中,使用new的时候,只有花括号可以通过编译,而同样的emplace_back就不行 阅读全文

posted @ 2022-11-04 20:15 tsecer 阅读(829) 评论(0) 推荐(0) 编辑

为什么gcc生成的目标文件没有包含源文件定义的符号
摘要:一、问题 当gcc的优化打开前后的效果不同时,可以通过gcc的-Q --help=optimizers查看在构建时gcc默认开启了哪些选项 tsecer@harry: gcc -Q --help=optimizers -O1 tsecer.cpp | more 下列选项控制优化: -O -Ofast 阅读全文

posted @ 2022-09-22 19:18 tsecer 阅读(164) 评论(0) 推荐(0) 编辑

从__builtin_ia32_lzcnt_u16到lzcntw指令
摘要:内联函数的原始定义 gcc\config\i386\i386-builtin.def /* LZCNT */ BDESC (OPTION_MASK_ISA_LZCNT, CODE_FOR_lzcnt_hi, "__builtin_ia32_lzcnt_u16", IX86_BUILTIN_LZCNT 阅读全文

posted @ 2022-07-28 20:19 tsecer 阅读(144) 评论(0) 推荐(0) 编辑

gcc如何实现C++中函数auto返回类型推导
摘要:一、问题 在新的C++标准中,auto的应用范围越来越广,但是比较常用的典型场景在于使用一个auto接收一个函数的返回值。问题是对于一个函数的auto返回值,这个返回值是如何确定的?特别是一个函数有多个返回值的时候。直观上的理解是当一个函数体(function body)解析(parse)完成之后, 阅读全文

posted @ 2021-05-06 21:31 tsecer 阅读(1205) 评论(0) 推荐(0) 编辑

从lambda的capture语义看gcc名字查找
摘要:一、问题的引入 对于lambda表达式的capture内容,比较知名的是capture-default,也就是通过“&”或者“=”引导的缺省捕捉,通常的做法大家应该都是使用"&"以引用的形式引入。但是如果捕捉内容为空时,此时语法如何处理?从文档上看,如果是global/tatic/thread/co 阅读全文

posted @ 2020-10-23 20:43 tsecer 阅读(373) 评论(0) 推荐(0) 编辑

delete operator是否可以为虚函数
摘要:一、为什么会考虑这个问题 假设框架提供一种机制,这种机制对于处理之后的所有对象都会执行释放(delete)操作,但是对于一些存在于内存池中的结构,如果使用默认delete操作就会有问题,因为默认的delete操作是把指定内存当做堆中空间操作的,所以对于位于内存池中的类型就需要考虑是不是需要重载自己的 阅读全文

posted @ 2020-10-19 21:20 tsecer 阅读(185) 评论(0) 推荐(0) 编辑

C++11中using语法解析及用法
摘要:一、using的所有语法功能 using这个关键字当然不是在C++11中添加的,但的确是在C++11中扩展了这个关键字的意义,其中最关键的扩展就是增加alias这种语法意义。直接查看gcc的代码,可以清晰的看到using关键字的所有用法及意义。在gcc-4.9.0\gcc\cp\parser.c文件 阅读全文

posted @ 2020-09-14 19:01 tsecer 阅读(2607) 评论(0) 推荐(0) 编辑

从operator new看C++操作符重载
摘要:一、gcc对于new operator的说明 主要是说明:new操作在语法逻辑上看是在new之后一定要看到“类型”的,举个简单的例子:字面量100是一个常量而不是类型,所以语法 new (100)是语法错误的。 /* Parse a new-expression. new-expression: : 阅读全文

posted @ 2020-06-08 20:40 tsecer 阅读(623) 评论(0) 推荐(0) 编辑

关于C++中constexpr的说明
摘要:一 、为什么需要constexpr 有时候需要编译时常量,现在能想到的典型的场景是在确定一个数组长度的声明中。比方说,需要64个bit,也就是8个字节,在32位机器上,需要两个long,在64位机器上需要一个long。那么此时的声明大概可能是long bits[sizeof(long) == 32 阅读全文

posted @ 2020-05-07 20:05 tsecer 阅读(3503) 评论(0) 推荐(0) 编辑

为什么在需要使用‘template as a disambiguator’
摘要:一、为什么用这个标题 标题中的Chinglish并不是为了装逼,而是为了更加原汁原味的表达这个问题的出现场景,这个说法来自gcc的提示:gcc-4.4.7\gcc\cp\parser.cstatic boolcp_parser_optional_template_keyword (cp_parser 阅读全文

posted @ 2020-03-27 20:34 tsecer 阅读(317) 评论(0) 推荐(0) 编辑

C++中模板特殊化(speicialization)的偏序关系及make规则选择
摘要:一、Makefile中的匹配 在Makefile中,可以通过不同的pattern指定不同目标的执行规则,在这个时候就会存在一个哪个target更合适的问题。这里Makefile中引入的是一个stem的概念,从stem中选择最短的。gnu make对该规则的说明A target pattern is 阅读全文

posted @ 2020-01-18 11:31 tsecer 阅读(625) 评论(0) 推荐(0) 编辑

从gcc代码看go语言goroutine和channel实现
摘要:一、go语法解析主要文件 go语言的前端解释代码位于gcc-4.8.2\gcc\go\gofrontend\parse.cc文件,对于源文件的解析从Parse::program开始。从这个函数看,源文件开始必须通过package指明自己的名称;如果有import,它们必须击中在package后面,第 阅读全文

posted @ 2019-09-04 17:42 tsecer 阅读(535) 评论(0) 推荐(0) 编辑

gcc如何处理函数的throw属性
摘要:一、问题 在c++的语法中,可以在函数声明中添加throw(),throw(type1, type2)之类的说明,前者声明该函数不被抛出任何异常,后者则是声明该函数只会抛出type1,type2类型的异常。当然这里并不是像孔乙己一样来说明回字的四种写法;更不是为这个语法摇旗呐喊,相反,各种论调都是不 阅读全文

posted @ 2019-03-07 09:58 tsecer 阅读(417) 评论(0) 推荐(0) 编辑

pure virtual method called的一种情况
摘要:一、实例代码 看了下面的例子,可能问题已经非常清晰了,但是这个例子就是为了让问题看起来清晰而故意这么写的,如果是在一个大型的项目中,特别是使用了大量的第三方库,这个问题并不是大家现在见到的这么显而易见的。下面是复现问题的demo: tsecer@harry: cat callpure.cpp #in 阅读全文

posted @ 2019-03-07 09:47 tsecer 阅读(4311) 评论(0) 推荐(1) 编辑

1 2 下一页

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示