百科问答小站 logo
百科问答小站 font logo



如何评价call_in_stack这个库? 第1页

  

user avatar   zhudouxiaole 网友的相关建议: 
      

我是作者(yuanzhubi) 我来简单说几句开发时的一些体验。


0. call_in_stack就是让一个函数用任何一块内存作为栈来执行的库,纯头文件的。可以让协程创建的时候少分配些栈,执行函数的时候再按需使用。支持C++03(使用右值需要配置头文件里或者编译的时候定义一个红。)。

1. 我工作的开发场景是C++ 03。所以右值的支持放到最近才支持,也没有使用变长模版参数这样的特性。

2. call_in_stack最早的名字是call_with_stack, 结果发现arm linux内核中有一个类似的同名函数(功能也类似,但是只固定支持一个void*参数,用起来颇似线程创建。。),所以把with换成了in。

3. X64和x86 gcc不支持naked属性,我却需要写很多内嵌汇编,那么编译器进入一个函数到底会不会默认push ebp呢?解决这个问题我好费神,因为x64上不同优化等级这个问题答案也不同。

4. 多用编译期常量比较操作,少用偏特化。实际要考虑的组合千变万化,于是我尽量把ABI上的组合变化放在了内嵌汇编部分,这个部分已经没有了类型信息,我就痛痛快快的做常量比较 if else了,O0优化也会帮你干掉那些不需要的语句。

5. 苹果MAC操作系统是21世纪才使用x86和x64的,x86的ABI和linux有点点轻微的差异,主要在long double和函数调用堆栈对齐上。

6. GCC内嵌汇编上的支持好勉强,我定义寄存器变量却总是收到未初始化就使用的警告;我已经在内嵌汇编中ret了,却总是警告我没有给返回值。。吐槽点满满的,洒满一身。为了避免给使用者在-Wall的时候产生很多警告,我也用了很多黑科技手段去避免警告还不让性能有任何指令级的损失。

7.尽量避免C++模版编译结果体积膨胀:类型聚合(type union)(自己的C++小工具系列5) - 知乎专栏 类型聚合是个好方法,让我实现了用内嵌汇编去返回C++引用还不引起任何编译器警告。有兴趣的同学可以去瞅瞅源码。

8. 接下来的计划是支持lambda。因为好多人建议不仅仅是需要支持call_in_stack for function, 而是要让一大块代码都能整体在一个新的stack执行。考虑到lambda的ABI是没有公开的,打算做个wrapper去实现。




  

相关话题

  关于Qt性能的损失,有没有一个可以量化的概念? 
  C/C++编译器在什么情况下不会重排语句? 
  C++ 中 new 和定位 new 的返回值都是 void*,却为什么可以被赋值给不同类型的指针? 
  C++20 即将到来的 coroutine 能否与 Golang 的 goroutine 媲美? 
  Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗? 
  为何C++11与1y都没有将network功能优先加入标准库? 
  同时会C#、Qt还有Python是一种什么体验? 
  如何以最小的改动尽量不改变已有代码的情况下适应不断变更的需求? 
  对于这一条add指令,ALU是不是会被使用2次来分别计算有效地址和数据?而且是在1个阶段内还是2个阶段 
  0除以0怎么使用c++的异常处理,例如try? 

前一个讨论
为啥不把 内存GPU 显存都集成到 CPU里?
下一个讨论
体验最好的 PE 系统是什么?





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利