2010-12-01 61 views
1

我知道什么时候引用是一个函数的参数,并且该函数是内联的,那么引用可能就是引用本身,而不一定是它的指针,但是当引用不是一个参数但是是函数的局部或全局的,或是一个函数的输出,其被内联:在这些情况下如何处理引用?

//global scope 

void someFunc(SomeType & ref){//when function is inline, it's possible for ref to be the referent itself 
//function body 
} 
int num=7; 
int & ref=num;//what about ref here? 
void someFunc1(){ 
int num=6; 
int & ref=num;//what about ref here? 
//rest of function body 
} 
int & someFunc2(){//what about output reference here when function is inlined, will it be num itself or a pointer ? 
int num=8; 
return num; 
} 

回答

1

DavidRodríguez - dribeas在一篇评论中指出,该标准给编译器提供了相当多的纬度,当涉及到引用时。他们可能会也可能不会占用空间;它们本身并不是适当的对象等。

您为引用类型的函数参数(在内联过程中被删除)描述的行为对于编译器涉及到引用时的自由是很典型的。但这是一种自由,不是他们的义务。以下情况可能并不总是可能的:当您拨打SomeFunc(a>5 ? foo : bar);时,编译器无法将引用替换为“该”引用本身。

您的其他示例同样不受限制。从理论上讲,全球和地方的参考资料可以被优化,因为没有任何东西可以阻止它。最后一个示例可以完全内联为exit(NasalDemons());,因为您要返回对超出范围的对象的引用。

1

在第一情况下,当参考是全球它将全局NUM指向源文件的末尾。第二种情况下,当参考号是someFunc1时,它会将num指向someFunc1的末尾。你不应该这样做,因为num将在someFunc2的末尾被销毁,所以如果你在外面使用它,你将会出现分段错误。

+0

这个问题到底是“指向”的意思。 – Pooria 2010-12-01 09:56:25

1

然后引用将是指涉 本身不一定是指针 它

语义上,一个参考是总是(对于名称)对象本身,和从未一个指向它的指针。

在实现方面,不保证如果函数被内联,则不会使用指针。无论是全球变量还是局部变量都无法保证。您的someFunc2()创建一个悬挂参考,具有未定义的行为。

在所有三种有效的情况下(内联,全局,本地),编译器很可能会避免使用额外的空间来存储指针,但是如果你想做出明确的语句,那么你需要选择一个编译器并检查它的内部。如果是全局外部链接,显然可执行格式也必须允许。

相关问题