c++函数返回值的初始化

本文探讨了C++函数返回自定义类对象时的初始化过程。通过实例代码和汇编分析,揭示了在函数调用中如何通过默认构造函数初始化返回对象,并讨论了编译器的NRV(Named Return Value)优化,避免了不必要的拷贝构造操作。
摘要由CSDN通过智能技术生成

引言

      c++函数返回值,如int, char, float等内建类型可以使用寄存器返回。但是如果我返回了自定义的一个类呢?那么函数返回时当前栈帧释放了,如果保存返回对象的值。它又在什么时候初始化? 让我们从汇编层次来看问题。

代码

    编写测试代码如下,非常简单的一个例子。测试平台为i386。

#include <stdio.h>
#include <stdint.h>

#include <string>

#define trace(fmt, ...) printf("[trace] %s:%s:%d " fmt, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__)

class CPackage
{
	public:
		CPackage(){}
		CPackage(const CPackage &pkg)
		{
			m_data = pkg.m_data;
			m_datalen = pkg.m_datalen;
		}
		const char *data(size_t &len)
		{
			len = m_datalen;
			return m_data;
		}
	private:
		char *m_data;	
		uint32_t m_datalen;
};
CPackage create_package()
{
	CPackage package;
	return package;
}
int main(int argc, char *argv[])
{
	CPackage package = create_package();

	size_t datalen = 0x00;
	const char *data = package.data(datalen);
	trace("package date %p, len %#X\n", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值