摘要:intro 通常C/C++中函数一般不会直接传递一个结构,更多处于性能考虑都会传递一个const类型的结构引用/指针。但是既然语言本身支持这种语法功能,编译器必定就要有对应的实现/规范/标准:否则不同编译器(例如gcc和llvm)生成的二进制文件(lib库)之间就没有办法兼容。特别是聚合类对象(st
阅读全文
摘要:intro 在阅读k8s的源代码时,发现代码中有一个(一组)很简单粗暴的interface转换:将一个interface(storage对象)尝试向各种类型转换。golang中每个结构的method并不是在结构内定义,在类型转换的时候,运行时只要判断转换源实现了目的类型的所有method就可以成功完
阅读全文
摘要:intro 大部分“现代”语言都支持自动内存回收(garbage collection),也支持反射(reflection)。go作为一种新出现的语言自然也不例外。 lua、Python作为动态语言,类型信息就保存在对象中,这也是动态语言可以动态添加字段/执行函数的基础。 golang作为C语言的广
阅读全文
摘要:intro 在使用模板声明中,有一个经典的问题就是如何区分模板声明中的">>"是右移操作符还是一个模板声明的结束标志。好在新的C++标准削弱了这个很强的限制,而是允许reasonable的、根据上下文对符号进行不同的解析。 C++11 improves the specification of th
阅读全文
摘要:问题 C++的异常处理看起来是一个比较神奇的功能,能够在运行时穿越堆栈,从异常发生位置直达异常处理位置。通过gcc的代码可以看到,这个堆栈回溯的一个关键步骤是这个宏,其中又使用了gcc的内置指令__builtin_eh_return。网上关于__builtin_eh_return这个内置函数的资料较
阅读全文
摘要:keyword go语言介绍中标榜的一个重要特点是语法简单,这里有一个不同语言关键字的个数,同样是为了防止网页打不开或者丢失,这里单独复制一份: C (ANSI (C89)) (32 keywords) C (C11) (44 keywords) C (C17) (44 keywords) C (C
阅读全文
摘要:identifier C++的前端对identifier做了扩展,在每个identifier中还包含了两个cxx_binding字段:namespace_bindings和bindings。当通过字符串找到一个identifier的时候,同时顺带获得了两个binding信息。 /* Language
阅读全文
摘要:函数返回 如果一个函数的返回点比较多,而且函数比较长,想通过调试器知道函数从哪个位置退出就会比较麻烦。有些资料说一般编译器的所有return最终会经过同一条ret(机器指令)返回,所以只要找到该指令的位置打断点即可。这个对于没有开优化的指令可能是正确的,开启优化生成的二进制中经常可以看到一个函数内有
阅读全文
摘要:问题 在初始化一个类的时候,在某些情况下,希望先初始化对象的一个字段,然后其它字段根据这个已经初始化的字段再初始化。简单来说,就是类似于这种初始化调用想精简一下 struct A { int x, y; }; int tmp = foo(); A a{tmp, tmp + 10} 这种形式,是否可以
阅读全文
摘要:测试代码 使用emplace_back可以避免不必要的构造和拷贝,而是直接在向量的内存位置执行construct进行构造,代码看起来也更加简洁。 但是在使用的时候,会发现有一些和直观不太对应的情况。例如,在下面的例子中,使用new的时候,只有花括号可以通过编译,而同样的emplace_back就不行
阅读全文
摘要:一、问题 当gcc的优化打开前后的效果不同时,可以通过gcc的-Q --help=optimizers查看在构建时gcc默认开启了哪些选项 tsecer@harry: gcc -Q --help=optimizers -O1 tsecer.cpp | more 下列选项控制优化: -O -Ofast
阅读全文
摘要:内联函数的原始定义 gcc\config\i386\i386-builtin.def /* LZCNT */ BDESC (OPTION_MASK_ISA_LZCNT, CODE_FOR_lzcnt_hi, "__builtin_ia32_lzcnt_u16", IX86_BUILTIN_LZCNT
阅读全文
摘要:一、问题 在新的C++标准中,auto的应用范围越来越广,但是比较常用的典型场景在于使用一个auto接收一个函数的返回值。问题是对于一个函数的auto返回值,这个返回值是如何确定的?特别是一个函数有多个返回值的时候。直观上的理解是当一个函数体(function body)解析(parse)完成之后,
阅读全文
摘要:一、问题的引入 对于lambda表达式的capture内容,比较知名的是capture-default,也就是通过“&”或者“=”引导的缺省捕捉,通常的做法大家应该都是使用"&"以引用的形式引入。但是如果捕捉内容为空时,此时语法如何处理?从文档上看,如果是global/tatic/thread/co
阅读全文
摘要:一、为什么会考虑这个问题 假设框架提供一种机制,这种机制对于处理之后的所有对象都会执行释放(delete)操作,但是对于一些存在于内存池中的结构,如果使用默认delete操作就会有问题,因为默认的delete操作是把指定内存当做堆中空间操作的,所以对于位于内存池中的类型就需要考虑是不是需要重载自己的
阅读全文
摘要:一、using的所有语法功能 using这个关键字当然不是在C++11中添加的,但的确是在C++11中扩展了这个关键字的意义,其中最关键的扩展就是增加alias这种语法意义。直接查看gcc的代码,可以清晰的看到using关键字的所有用法及意义。在gcc-4.9.0\gcc\cp\parser.c文件
阅读全文
摘要:一、gcc对于new operator的说明 主要是说明:new操作在语法逻辑上看是在new之后一定要看到“类型”的,举个简单的例子:字面量100是一个常量而不是类型,所以语法 new (100)是语法错误的。 /* Parse a new-expression. new-expression: :
阅读全文
摘要:一 、为什么需要constexpr 有时候需要编译时常量,现在能想到的典型的场景是在确定一个数组长度的声明中。比方说,需要64个bit,也就是8个字节,在32位机器上,需要两个long,在64位机器上需要一个long。那么此时的声明大概可能是long bits[sizeof(long) == 32
阅读全文
摘要:一、为什么用这个标题 标题中的Chinglish并不是为了装逼,而是为了更加原汁原味的表达这个问题的出现场景,这个说法来自gcc的提示:gcc-4.4.7\gcc\cp\parser.cstatic boolcp_parser_optional_template_keyword (cp_parser
阅读全文
摘要:一、Makefile中的匹配 在Makefile中,可以通过不同的pattern指定不同目标的执行规则,在这个时候就会存在一个哪个target更合适的问题。这里Makefile中引入的是一个stem的概念,从stem中选择最短的。gnu make对该规则的说明A target pattern is
阅读全文