【问题标题】:Reason for not using static variables?不使用静态变量的原因?
【发布时间】:2014-04-01 10:22:55
【问题描述】:

我认为使用静态变量可能会导致代码的可读性不明确,但没什么特别的。但是现在,我知道有 5 个数据段:文本、数据、bss、堆、堆栈。文本段用于代码,数据段。用于声明的变量,bss seg。用于未声明的变量,堆用于指针,堆栈用于函数变量。

最好不要使用静态变量而不是局部变量来最小化程序在运行时在计算机上占用的大小?

我很确定静态变量和全局变量保存在 bss 或数据段中。而且编译后bss和数据段的大小没有变化。而对于堆和栈来说,一旦使用它们就会被释放,所以不用担心大小。

我这样想对吗?

【问题讨论】:

  • 静态变量通常会使你的代码不可重入,所以你应该尽量避免它们。
  • 您应该根据需要使用存储类型(如每种语言功能)(无论存储在何处)。如果您需要静态的东西,请将其设为static。如果您需要自动执行某些操作,请将其设为“本地功能”,即自动执行。此外,几乎可以肯定,自动存储不仅更安全(在可重入方面)而且速度更快。
  • 我相信这些问题只与非常小的内存环境相关,例如嵌入式微控制器,其中可执行文件的大小可能很重要。对于所有其他机器,尤其是 1985 年以后的任何 PC,标准只是适合您使用的存储类别。另请注意,虽然具有静态存储持续时间的对象是零初始化的,但这种初始化不仅非常便宜,而且每次程序运行只发生一次。
  • @SergeyL。让我的代码可重入总是好的吗?除了不使用静态变量之外,编写可重入代码还有什么好的做法?

标签: c++ c


【解决方案1】:

文本段用于代码,数据段。用于声明的变量,bss seg。用于未声明的变量

到目前为止,你是对的。

堆用于指针

没有。堆用于通过malloc() 分配的数据,在C++ 的情况下为new

指针存储在您放置它们的任何位置(数据、bss、堆栈)。

函数变量的堆栈。

对于函数参数。

最好不要使用静态变量而不是局部变量来最小化程序在运行时在计算机上占用的大小?

变量存在时大小完全相同(在 data/bss 与堆栈上);如果不存在,则基于堆栈的方法获胜。

基于堆栈的方法在其他方面也胜出:可重入性(如前所述)和可读性。

对于堆和堆栈,它们在使用后就会被释放,因此无需担心大小。

当然,您也必须担心这里的大小。只要去尝试分配一百万个 16 MiB 大小的块(至少在 32 位机器上),你会看到......

您应该在需要时使用static 变量,如果不需要,则使用其他变量。

【讨论】:

    【解决方案2】:

    当你声明一个变量static时,这意味着它必须用0初始化。所以它

    是编译器使用 0 初始化它的额外努力。所以如果你说

    100 变量,那么编译器的工作量将是声明它们的100

    automatic.But automatic 变量没有初始化为任何值,因此它们包含

    garbage。所以建议不要使用static,只要需要。

    【讨论】:

    • 这根本不是重点。初始化为 0 可以由操作系统完成,尤其是通过内存管理例程,您可以指示它传递一个填充为 0 的页面。在其他平台上,init 例程必须自己完成。但是用 0 填充内存是最便宜的操作之一,所以不用担心。
    猜你喜欢
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 2012-02-29
    相关资源
    最近更新 更多