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

C++ 复制堆栈上的成员值或使用指针访问它?,c++,c,performance,memory,C++,C,Performance,Memory,所以我得到了一个结构,它包含一个整数。我通常在堆上创建该结构。如果我现在将指向此类结构的指针传递到函数中并使用integer成员,那么如果我首先复制堆栈上的members值并在函数中使用该局部变量,会更快吗?还是应该通过指针访问该成员?什么可能更快?显然,我不想修改成员值。代码示例: 样本结构: struct sample_s { int sample_member; } 方式1: void sample_func(struct sample_s *sample_instance) {

所以我得到了一个结构,它包含一个整数。我通常在堆上创建该结构。如果我现在将指向此类结构的指针传递到函数中并使用integer成员,那么如果我首先复制堆栈上的members值并在函数中使用该局部变量,会更快吗?还是应该通过指针访问该成员?什么可能更快?显然,我不想修改成员值。代码示例:

样本结构:

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);
  }
}
void sample\u func(结构示例*sample\u实例)
{
对于(int i=0;i<1000;i++)
{
printf(“%d”,示例\u实例->示例\u成员);
}
}
方式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);
  }
}
void sample\u func\u two(结构示例*sample\u实例)
{
INTA=样本\实例->样本\成员;
对于(int i=0;i<1000;i++)
{
printf(“%d”,a);
}
}

在您的特定情况下,
sample\u func\u two
可能更快。这是因为您正在调用一个外部函数,
printf

printf("%d", sample_instance->sample_member);
编译器可能不知道此调用不会修改
*sample\u实例
1,因此每次通过循环时都会从内存重新加载
sample\u成员

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



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

在您的特定情况下,
sample\u func\u two
可能更快。这是因为您正在调用一个外部函数,
printf

printf("%d", sample_instance->sample_member);
编译器可能不知道此调用不会修改
*sample\u实例
1,因此每次通过循环时都会从内存重新加载
sample\u成员

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



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

您需要一个常量,因为您不打算更改值。(C++的情况)看起来非常像过早优化。实际上,如果编译器会为这两个代码段生成不同的输出,我会感到惊讶。构建这两个变体(启用优化)并使用反汇编程序比较生成的机器代码。我怀疑是否会有任何区别。@ Jejo它既标记了C++又包含了C,所以没有const &只是为了不知道它,这是一个非常有用的工具来研究这样的情况:你需要一个const &因为你不打算改变这些值。(C++的情况)看起来很像是过早的优化。实际上,如果编译器会为这两个代码段生成不同的输出,我会感到惊讶。构建这两个变体(启用优化)并使用反汇编程序比较生成的机器代码。我怀疑是否会有任何区别。@ Jejo它既标记了C++又包含了C,所以没有const &只是为了不知道它,这是一个非常有用的工具来研究这样的情况:<代码> Prtff < /Cuff>在C++中引用一个参数吗?如果不是,printf的主体将如何访问这些内存地址?同样,如果这里声明printf为纯,编译器可以(和GCC将)将整个函数优化为单个
返回语句。@ AlxReung:< C++ > SAMPLE实例/<代码>可以指向全局变量,未知函数可以直接访问全局变量。如果不是,printf的主体将如何访问这些内存地址?同样,如果这里声明printf
为纯,编译器可以(和GCC将)将整个函数优化为单个
返回语句。@AlexReinking
sample\u实例
可以指向全局变量,未知函数可以直接访问全局变量。