【问题标题】:Does variables holding the empty value also occupy the space in ram?持有空值的变量是否也占用了 ram 中的空间?
【发布时间】:2018-12-11 21:30:56
【问题描述】:

如果我设置变量,在任何编程语言中:

name = 'Jhon';

因此,它将在 RAM 中占用 4 个字节的空间。但是如果:

name = '';

它仍然会在RAM 中保留一个空白区域,或者会是什么场景?

【问题讨论】:

  • “x”是指“C”吗?
  • 我编辑我的问题
  • 您的问题没有好的答案。所有语言都是不同的。所有语言都有一些优化,可以一起删除 var。有些需要变量本身的额外元数据。对于'c',如果不优化,第一个例子会占用5个字节,第二个,1个字节。它可能是字对齐的。
  • 哪种语言?哪个内存?如果你不使用变量编译器可以剥离它。 'John' 是我想的一个字符串(不是 C/C++,看起来你正在使用 PHP)。字符串是许多语言中的基本类型,但内存占用取决于。有些语言存储带有长度前缀的字符串,有些带有终止符(如 C),有些带有内存范围。对齐也会影响内存需求。有些实现了一些智能复制,例如复制一个常量字符串(就像您在示例中所做的那样)可以只使用一个指针。请更具体!
  • 如果您想了解 Javascript,那么您应该提出有关 Javascript 的问题。您通过标记 [c] 发送了混合信号,但提出了建议您想要一个涵盖所有语言的答案的散文,现在询问 cmets 中的 Javascript。单看散文,这个问题太笼统了。考虑到标签和评论,不清楚。

标签: c variables byte bit ram


【解决方案1】:

对于 C,如果存储对于实现程序的可观察行为不是必需的,则允许编译器不预留存储。例如,如果您有类似的程序

int main( void )
{
  int x;
  int y;

  y = some_value();
  printf( "y = %d\n", y );
  return 0;
}

变量x 从未被引用,并且在y 的计算或显示中没有任何作用(我们假设它对some_value() 不可见)。在这种情况下,编译器可以不为其留出任何空间。

类似地,在类似的程序中

int main( void )
{
  int y = 0;
  printf( "y = %d\n", y );
  return 0;
}

编译器可以判断这和写的完全一样

int main( void )
{
  printf( "y = 0\n" );
  return 0;
}

根本不用为y 留出空间。

不同的语言有不同的规则;如果您好奇,请询问该特定语言。

【讨论】:

    【解决方案2】:

    以下假设代码是 C 语言,并且变量不是简单地优化不存在:

    由于它被标记为 C,我假设 name 的类型为 char *,或指向 char 的指针。这意味着变量 name 本身总是占用 4 个字节(32 位系统)或 8 个字节(64 位系统),因为这就是指针通常的大小。

    但是,name 指向的内存量会有所不同,正如您所描述的那样,需要注意一个警告 - 您需要为终止字符添加一个额外的字节。该字符是一个特殊字符,它向程序表明该字符串已完成。

    对于上述两种情况,char * name = "Jhon"; 实际上需要 13 个字节的空间 - 8 个字节用于指针,4 个字节用于每个字符,另一个字节用于终止字符。同样,char * name = ""; 需要 9 个字节的空间 - 8 个字节用于指针,1 个字节用于终止字符。

    【讨论】:

    • 使用双引号 " 而不是单引号 '。含义和语法非常不同。
    • Javascript 中的场景是什么?
    • @PurpleBytes:如果您对 JavaScript 感兴趣,那么我建议您提出一个单独的问题并指出(通过适当地标记问题和在问题本身中)您感兴趣这在 JavaScript 中是如何发生的。事实上,您已经用C 标记了这个问题,因此答案与 C 编程语言有关。请不要简单地编辑您当前的问题,因为使现有答案(我的和约翰的)无效的编辑通常是不受欢迎的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2013-03-14
    • 2015-03-21
    相关资源
    最近更新 更多