百科问答小站 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去实现。




  

相关话题

  指令前缀0x66到底是干什么用的? 
  关于 C++ 顶层 const 和底层 const? 
  c++的单例模式为什么不直接全部使用static,而是非要实例化一个对象? 
  能否用外行也能懂的语言解释为什么C++很「危险」? 
  能否把高版本的libstdc++静态连接到一个只暴露纯C接口的动态库中,给低版本c++程序调用? 
  为什么C++没有Python那么多开源库? 
  有什么C可以实现但C++不能实现的东西吗? 
  如何让停留在语法层面的 C++,变成实际工程中的 C++? 
  PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点? 
  C++ 中,如果指针换了被指向的东西,那被指向的原来的东西(是被 new 出来的)所占的内存会立刻被释放吗? 

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





© 2025-04-01 - tinynew.org. All Rights Reserved.
© 2025-04-01 - tinynew.org. 保留所有权利