Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Objective-C++ - RVO

タグ: Objective-C C++

Objective-Cのメソッドが戻り値としてC++の一時オブジェクトを返す時、RVOは適用されるか。
……いや、それ以前にC++のオブジェクトを返せるのか?
基本的にはただの関数と変わらないのだから、C++のオブジェクトくらい返せそうだが。

#import <Foundation/Foundation.h>

class Foo
{
public:
	Foo()
	{
		NSLog(@"default constructor");
	}
	
	Foo(int arg) :
	val(arg)
	{
		NSLog(@"constructor with %d", arg);
	}

	Foo(const Foo& rhs) :
	val(rhs.val)
	{
		NSLog(@"copy constructor");
	}
	
	~Foo()
	{
		NSLog(@"destructor");
	}
	
	int val;
};

@interface Bar : NSObject
- (Foo)rvo;
- (Foo)nrvo;
- (Foo)notRvo;
@end

@implementation Bar

- (Foo)rvo
{
	return Foo(123);
}

- (Foo)nrvo
{
	Foo foo;
	foo.val = 234;
	return foo;
}

- (Foo)notRvo
{
	static Foo foo(555);
	return foo;
}

@end

@interface Baz : Bar
@end

@implementation Baz

- (Foo)rvo
{
	return Foo(345);
}

- (Foo)nrvo
{
	Foo foo;
	foo.val = 456;
	return foo;
}

@end

void rvo(Bar* bar)
{
	Foo foo = [bar rvo];
	NSLog(@"%d", foo.val);
}

void nrvo(Bar* bar)
{
	Foo foo = [bar nrvo];
	NSLog(@"%d", foo.val);
}

void not_rvo(Bar* bar)
{
	Foo foo = [bar notRvo];
	NSLog(@"%d", foo.val);
}

int main (int argc, const char * argv[])
{
	NSAutoreleasePool* pool =
		[[NSAutoreleasePool alloc] init];

	Bar* bar = [[Bar alloc] init];
	NSLog(@"- bar RVO");
	rvo(bar);
	NSLog(@"- bar NRVO");
	nrvo(bar);
	NSLog(@"- bar not RVO");
	not_rvo(bar);
	[bar release];

	bar = [[Baz alloc] init];
	NSLog(@"- baz RVO");
	rvo(bar);
	NSLog(@"- baz NRVO");
	nrvo(bar);
	NSLog(@"- baz not RVO");
	not_rvo(bar);
	[bar release];

	[pool drain];
	return 0;
}
- bar RVO 
constructor with 123 
123 
destructor 
- bar NRVO 
default constructor 
234 
destructor 
- bar not RVO 
constructor with 555 
copy constructor 
555 
destructor 
- baz RVO 
constructor with 345 
345 
destructor 
- baz NRVO 
default constructor 
456 
destructor 
- baz not RVO 
copy constructor 
555 
destructor 
destructor

RVOもNRVOもコピーコンストラクタも、問題なく動作しているようだ。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/138-ea55bda0
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。