复制堆栈上的成员值或使用指针访问它?

时间:2018-06-01 11:27:55

标签: c++ c performance memory

所以我得到了一个结构,它包含一个整数。我通常在堆上创建该结构。如果我现在将一个指向这样的结构的指针传递给一个函数并使用整数成员,如果我最初复制堆栈上的成员值并在函数中使用该局部变量,或者我应该通过指针?什么可能更快?显然我不想修改成员值。代码示例:

样本结构:

struct sample_s
{
  int sample_member;
}

方式1:

void sample_func(struct sample_s *sample_instance)
{
  for(int i = 0; i < 1000; i++)
  {
    printf("%d", sample_instance->sample_member);
  }
}

方式2:

void sample_func_two(struct sample_s *sample_instance)
{
  int a = sample_instance->sample_member;
  for(int i = 0; i < 1000; i++)
  {
    printf("%d", a);
  }
}

1 个答案:

答案 0 :(得分:2)

在您的具体情况下,sample_func_two 可能更快。这是因为您正在调用外部函数printf

printf("%d", sample_instance->sample_member);

编译器可能不知道此调用不会修改*sample_instance 1 ,因此每次循环都会从内存中重新加载sample_member

现在至于是否会对程序的运行时间产生实际影响,您必须自己进行基准测试。

1 编译器不知道,因为它无法看到printf的代码(它位于某个库中)并且printf未被声明为纯。实际上,printf不能被声明为纯,因为它可以通过其参数(使用%n)写入格式字符串。