最近,将 yasio Lua 绑定集成到xlua中使用,结果发现在Apple clang release优化编译模式下,lua构造yasio的io_service对象是直接crash了,刚开始表现是Unity Editor预览即闪退,后通过Xcode附加+VS联合调试发现crash原因是Bad Access, 于是花时间研究了下,将yasio从之前只能在c++11标准下编译,到现在支持在c++14,c++17乃至c++20标准下编译,同时对问题做了如下总结:
c++11:
lua_newuserdata
, 再通过placement new构造对象,在xcode clang release优化编译下会直接闪退LUAI_USER_ALIGNMENT_T=max_align_t
来解决c++14:
c++17:
new
操作符的Aligned allocation/deallocation
,通过添加编译选项-faligned-allocation可通过编译;本人思考和结论(欢迎指正):
max_align_t
类型是C11标准才引入的: max_align_t ,因此Lua作为ANSI C89标准兼容实现并未完美处理各个编译器地址对齐问题,而是留给了用户定义: LUAI_USER_ALIGNMENT_T
lua_newuserdata
始终能够返回地址对齐的内存