【问题标题】:Less memory methods更少记忆的方法
【发布时间】:2013-06-09 13:20:00
【问题描述】:

如果我有以下方法:

void addfive(int num)
{
    num = num + 5;
}

当我像这样在主程序中使用它时:

int a = 15;
addfive(a);

将发生的情况是 5 将被添加到 (a) 变量的副本中。 但如果方法参数是指针int* num 而不是int num 5 将被添加到(a) 变量中并且不会创建副本。

如果我在我的方法中使用了指针,这会比第一种方法使用更少的内存吗?这在 non_void 方法中是否有效?

【问题讨论】:

  • 有什么特别的原因不使用引用 (int &num) [假设 C++]?
  • 使用不同的参数规则发布 3 种语言的问题是个坏主意
  • 在 C++ 中,您显示的方法版本可能会被优化掉,因为它根本没有任何效果。在这种情况下,它将使用 less 内存而不是传递指针的内存。
  • 请不要将概念语义实际发生的情况混淆。

标签: c# c++ c pointers methods


【解决方案1】:

如果你使用指针,它仍然会使用内存,并且它通常会小于一个类型使用的内存,但在你的具体情况下,取决于你的系统(你的操作系统和应用程序)一个 int em> * 可能比 int 使用更多的内存,使用 sizeof 来查看类型和指针的大小,例如在 64 位构建的应用程序中使用此行:

std::cout << "Size of int is: " << sizeof(int) << ", size of int* is: " << sizeof(int*) << "\n";

但是通过指针或引用传递的另一种用法是能够对函数进行编码,以便对作为参数传递的对象(或内置类型)留下副作用。

【讨论】:

    【解决方案2】:

    它的实现定义了传递指针是否比传递整数占用更多或更少的内存。例如,在 MS Visual Studio 中int 占用 4 个字节,对于 32 位平台,指针占用 4 个字节,对于 x64 系统占用 8 个字节。

    通常是sizeof(int) &lt;= sizeof(int*)

    【讨论】:

      【解决方案3】:

      首先 +5 应用于“a”的副本和

       int a = 15;
       addfive(a);
      

      并且你的变量 a 不会改变,因为“a”是按值而不是引用传递的,如果你想要一个可以改变 a 的函数,你必须使用指针或“ref”关键字

      如果您使用的是 c 或 c++ 你的代码应该是这样的

      addfilve(*a)
      {
         *a = *a + 5;
      }
      int main()
      {
      int a = 15;
      int *aptr ;
      aptr = &a;
      
      return 0;
      }
      

      但是如果你使用 c#

      addfive(ref a)
      {
        a += 5;
      }
      

      以及何时使用该功能

      double a = 5;
      addfive(ref a); // a = 10 now
      

      注意,这是一种正常的功能而非扩展方法

      例如,如果您正在编写表单应用程序,则必须在 Form1 类中声明它

      【讨论】:

        猜你喜欢
        • 2015-02-17
        • 2014-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-18
        • 2013-05-26
        • 1970-01-01
        • 2017-07-07
        相关资源
        最近更新 更多