【问题标题】:C++ pointer namesC++ 指针名称
【发布时间】:2009-05-15 20:21:29
【问题描述】:

我知道指针是用来指向对象的,所以你在程序中也必须这样做。但是指针名称是如何存储的。声明一个比它指向的对象占用更多资源的指针名称是否有点矫枉过正,例如:

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

我知道这是一个荒谬的例子,但我只是想表达这个想法。

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

【问题讨论】:

  • 变量名和变量的区别你明白了吧?
  • 我认为你误解了指针。指针只是它指向的值所在的内存地址。使用的变量名对此完全没有影响。变量名只是一种使编写代码更容易的结构;他们不会更改生成的二进制文件。
  • 我投了赞成票,因为这是一个很好的问题 imo
  • @litb,请取消删除您的答案,太好了!我开始编辑以解释编译和链接,但中止了它,然后看到了你的。我认为这正是 Babiker 需要的信息。
  • 爱马仕,不要太确定。具有链接的名称(文件范围 (C) / 命名空间范围 (C++) 变量)通常会注册到符号表中以进行重定位。不过,可以使用“剥离”工具将它们剥离

标签: c++ pointers


【解决方案1】:

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

【讨论】:

  • 还有一小部分需要编译的内存和时间。
  • 我们最不需要的就是让开发人员尽可能短地命名他们的变量,以“优化编译时间”。
  • @rein:确实,在我们学院教授软件工程的讲师说长变量名称的缺点是编译时间变长,当我听到这句话时,我就像 :-O。我不得不忍受在这里教书的这些愚蠢的家伙:(
  • 哦,它会使编译时间更长。编译器在编译时要进行字符串比较,所以变量的长度会影响它。但是,差异不应该真的很明显。
  • 我明白,但说这话的人是在 1960 年代思考的,最糟糕的是他教授“软件工程”,应该提倡编写可维护的软件,而不是建议优化编译时间。
【解决方案2】:

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

例如,全局变量的名称不能被删除,因为您可能会在程序的另一个单元中使用它,并且链接器必须能够查找它。但是在你的程序被链接之后,即使是那些名字也可以被删除。

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

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

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

【讨论】:

  • 我真的很喜欢您提到将全局变量保留到链接阶段的方式...我认为 OP 在完全理解之前还有一些课程要学习,但这是很好的信息.
【解决方案3】:

不存储指针名称。指针名称(或与此相关的任何变量名称)不会编译到最终的二进制文件中(前提是您没有在符号设置为 on 的情况下进行编译)。

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

【讨论】:

    【解决方案4】:

    微软使用“p”前缀来表示指针:

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

    他们实际上在所有东西上都使用Hungarian

    一旦你习惯了它,它就会很好地工作。很多人一开始觉得很丑。

    无论您决定什么,我认为在名称中表示某事物是指针类型是很有价值的,尽管我不会像您的示例那样走得太远。 :)

    【讨论】:

    • 再说一次,妈妈们认为以任何形式或形式使用匈牙利语都是一个非常糟糕的主意。
    • 不,Microsoft 不再推荐使用匈牙利表示法,大多数人在意识到它有多大缺陷后认为它很丑。
    • 你能链接到他们说不再推荐的地方吗?
    • 在名字前面加上“p”并不是一个非常糟糕的主意。当你开始获得 lpsczCthulu 时,你需要担心从深处召唤伟大的旧日支配者。
    • 哦,我完全同意,限制应该是三个。我做过的最糟糕的事情是 psz(对于 char* 和 WCHAR*,顺便说一句)。很高兴看到 psz 与 sz,因为您可以在 sz 而不是 psz 上调用 ARRAYSIZE()。我永远不会打扰 c 和 m_ 完全一文不值。
    【解决方案5】:

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

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

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

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

    当然,如果您想修改函数内部的变量,您应该删除 const 关键字。

    【讨论】:

      【解决方案6】:

      我看不出为什么它应该放在任何东西之前。您的编译器/编辑器将为您完成这项工作。

      【讨论】:

        【解决方案7】:

        嗯,我明白你在这里问什么。记住变量名只会影响文本文件的大小和你编写它所花费的时间。但请记住,变量名、指针名和函数名等都会在 GNU GCC 编译器翻译成机器代码时丢失。最后存储在 .o 或 .exe 中的将是 0 和 1,因此您不必担心名称太大:)

        【讨论】:

          【解决方案8】:

          井指针最常用于动态分配的事物和/或函数。

          在动态分配的情况下,如果你坚持使用这种表示法,你可以在它前面加上 ptr。在函数的情况下,乐趣也同样有效。

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-12-09
              • 2013-07-04
              • 2018-03-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多