C ++指针名称

时间:2009-05-15 20:21:29

标签: c++ pointers

我理解指针用于指向对象,因此您必须在程序中使用相同的指针。但是,是否以及如何存储指针名称。如果声明一个指针名称占用的资源多于它所指向的对象,那会是一种过度杀伤吗?

int intOne = 0;
int *this_pointer_is_pointing_towards_intOne = &intOne;

我知道这是一个荒谬的例子,但我只是试图了解这个想法。

编辑:指针的名称必须存储在比某个指向对象的地址更多的字节处。

8 个答案:

答案 0 :(得分:22)

变量名的长度对程序的大小没有任何影响,只是编写程序所需的时间长度。

答案 1 :(得分:14)

只有编译器需要局部变量的名称才能找到要引用的变量。编译后,这些名称通常会被删除,并完全被数字符号或等价物替换。对于所有实际上没有链接的名称都会发生这种情况(当然,如果你进行调试构建,情况可能会有所不同)。因此,功能参数也是如此。

例如,全局变量的名称无法删除,因为您可以从程序中的其他单元使用它,并且链接器必须能够查找它。但是在你的程序被链接之后,甚至可以删除那些名称。

毕竟,这些并不占用运行时内存。这些名称存储在重新分配表中以便链接(请参阅strip程序如何删除这些名称)。

但无论如何,我们正在谈论几个已经被对齐和诸如此类浪费的字节。将其与模板实例化的地狱名称进行比较。试试这个:

readelf -sW /usr/lib/libboost_*-mt.so  | awk '{ print length($0), $0 }' | sort -n

答案 2 :(得分:9)

不存储指针名称。指针名称(或该事项的任何变量名称)不会编译到最终的二进制文件中(前提是您不能使用设置为on的符号进行编译)。

指针只是存储在内存中的整数(或长整数),而内存又指向它们指向内存中某个位置的项目。

答案 3 :(得分:4)

Microsoft使用“p”前缀来指示指针:

int intOne = 0;
int* pIntOne = &intOne;

他们实际上在所有事情上使用Hungarian

一旦你习惯了,它就会很好用。很多人一开始认为它很难看。

无论你决定什么,我认为在它的名字中表示某个东西是指针类型是有价值的,尽管我不会像你的例子那么远。 :)

答案 4 :(得分:2)

我同意以前的帖子,但我想指出一些问题。有时人们过度使用指针,认为他们的使用会自动提供小内存占用。这并非总是如此。考虑一下这段代码:

void myfunc(const char *var) {
    // Function body
}

指向char的指针将采用32位架构中的4个字节,而char本身通常占用1个字节。 (这里假设var指向一个字节,而不是字符串。)你能看到这一点吗?另一方面,您应该始终对复杂对象使用指针(或引用):

void myfunc(const string &str) {
    // Function body
}

当然,如果您要修改功能中的变量,则应删除const关键字。

答案 5 :(得分:1)

我没有看到为什么它之前应该有任何东西。您的编译器/编辑器将为您完成工作。

答案 6 :(得分:0)

井指针通常用于动态分配和/或功能的东西。

在动态分配的情况下,如果你坚持使用这种表示法,你可以在它之前加上ptr。就功能而言,乐趣同样适用。

答案 7 :(得分:0)

这里有两个关键点我想尝试提炼出来:

  1. 变量名称的长度对最终编译的C / C ++程序中为数据分配的空间没有影响,因为编译器为变量提供了自己的名称。
    • N.B。有些编译器,尤其是较旧的编译器,可能只识别变量名的前几个字母,因此在源代码中使用非常长的过于复杂的变量名可能会导致冲突
    • 另外,如果您创建用于调试的符号文件,它们将包含您的所有变量名称,因此将变得非常大但这可能不会显着减慢调试速度,我从未检查过!
  2. 存储指针所需的空间确实可能比所指向的数据所需的空间大,但在任何情况下仍有可能希望使用它们的情况。例如,在COM这样的体系结构中,实践是函数只返回结果代码(成功或失败),所有更改的数据都是通过堆栈上传递的指针完成的:
    /*
        pszString could be pointing to only one character which
        is less space than the pointer
    */
    HRESULT OneLetterSplat(char * pszString)
    {
        *pszString = 'a';
        return SUCCESS
    }