关于C++中memnew宏及_ALWAYS_INLINE_空函数的技术疑问
我正在通过书籍及开源C代码学习C,近期遇到一段难以理解的代码。头文件中的代码如下:
_ALWAYS_INLINE_ void postinitialize_handler(void *) {} template <class T> _ALWAYS_INLINE_ T *_post_initialize(T *p_obj) { postinitialize_handler(p_obj); return p_obj; } #define memnew(m_class) _post_initialize(new ("") m_class)
其使用方式为:
InputMap *input_map = memnew(InputMap);
其中postinitialize_handler是一个空的_ALWAYS_INLINE_函数,我无法理解作者如此设计的原因。直接编写InputMap *input_map = new InputMap("")既清晰又能实现功能,为何要使用memnew宏?
设计意图解析
虽然当前postinitialize_handler是空函数,但这套设计是为了预留扩展能力和统一内存分配的入口规范,具体原因包括:
统一后初始化逻辑:现在这个handler是空的,但后续如果需要给所有通过
memnew创建的对象添加统一的后初始化操作(比如注册到对象池、设置调试标记、统计内存使用、触发自定义回调),只需要修改postinitialize_handler的实现即可,无需逐个修改所有new调用的地方。封装内存分配细节:把
new ("")这个带位置参数的分配逻辑封装在宏里,避免重复编写。如果后续需要更改内存分配的方式(比如替换成自定义内存分配器、添加内存对齐参数),只需要修改memnew宏的定义,所有调用处都会自动生效。调试与追踪便利:在开发阶段,可以临时给
postinitialize_handler添加日志、断点,快速追踪所有通过memnew创建的对象,而不用在每个new语句里手动加调试代码。兼容重载的
operator new:这里的new ("")调用的是带字符串参数的重载operator new(通常用于传递内存分配的位置信息,方便内存泄漏排查),通过宏封装后,开发者不用每次都手动写这个参数,减少出错概率。统一代码风格:强制团队使用
memnew创建对象,避免出现混合使用普通new和带参数new的情况,保持代码风格一致,也便于后续的维护和重构。
内容的提问来源于stack exchange,提问作者J.L

