我读了标准n4296(Draft)§1.8第7页:
一个对象是存储的区域。[注意:函数不是对象,无论它是否以对象的方式占用存储空间。—尾注]
我花了几天时间在网上寻找被排除在外的好理由,没有运气。也许是因为我没有完全理解对象。所以:
很多区别归结于指针和寻址。在C ++¹中,指向函数的指针和指向对象的指针严格是分开的。
C ++要求您可以将任何对象类型的指针void
转换为的指针,然后将其转换回原始类型,其结果将等于以“²”开头的指针。换句话说,不管它们到底是怎么做的,实现都必须确保从指针到对象类型到指针到无效的转换是无损的,因此无论原始内容是什么,包含的任何信息都可以被重新创建,这样您可以通过从T*
到void *
返回到返回来找回与开始时相同的指针T*
。
这不是一个指向函数的指针,虽然真正的-如果你把一个指向函数的指针,将其转换为void *
,然后将其转换回一个指向函数的指针,你可能会失去在这个过程中的一些信息。您可能不找回原始指针,而取消引用所做的取回操作会给您带来不确定的行为(总之,请勿这样做)。
不管怎样,您都可以将一个函数的指针转换为另一种类型的函数的指针,然后将结果转换回原始类型,并确保结果与开始时相同用。
尽管它与手头的讨论并不特别相关,但还有一些其他差异可能值得注意。例如,您可以复制大多数对象,但是不能复制任何功能。
就与功能对象的关系而言:其实,除了一点之外,没有太多的东西:一个功能对象支持看起来像一个函数调用的语法,但是它仍然是一个对象,而不是一个函数。因此,指向功能对象的指针仍然是指向对象的指针。例如,如果将转换为void *
,然后将其转换回原始类型,则仍然可以保证您会返回原始指针值(对于函数的指针而言,这不是正确的)。
关于为什么函数指针与对象指针(至少潜在地)不同的原因:它的一部分归结于现有系统。例如,在MS-DOS(以及其他)上,有四个完全独立的内存模型:小型,中型,紧凑型和大型。小型模型对功能或数据使用16位寻址。媒介使用16位地址存储数据,使用20位地址存储代码。Compact将其反转(代码的16位地址,数据的20位地址)。大量用于代码和数据的20位地址。因此,在紧凑模型或中型模型中,在指向代码的指针和指向函数的指针之间进行转换确实会并且确实会导致问题。
最近,相当数量的DSP已将完全独立的存储器总线用于代码和数据,并且(与MS-DOS存储器模型一样)它们的宽度通常是不同的,在这两种情况之间进行转换并确实会丢失信息。
char
和返回的指针的转换,实际上都是一样的。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句