相关疑难解决方法(0)

在C++中,我是否应该费心缓存变量,还是让编译器进行优化?(混叠)

请考虑以下代码(p属于类型unsigned char*bitmap->width属于某种整数类型,具体哪个是未知的,取决于我们正在使用的某个外部库的版本):

for (unsigned x = 0;  x < static_cast<unsigned>(bitmap->width);  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

值得优化它[...]

可能存在这样一种情况,即通过编写可以产生更有效的结果:

unsigned width(static_cast<unsigned>(bitmap->width));
for (unsigned x = 0;  x < width;  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

...或者编译器优化是否微不足道?

您认为什么是"更好"的代码?

编辑(Ike)的注意事项:对于那些对三角形文本感到疑惑的人来说,原来的问题,如同措辞一样,非常接近于偏离主题的领域,并且尽管有积极的反馈,但非常接近于被关闭.这些已经被打乱了.但是,请不要惩罚那些解决这些问题的受影响部分的回答者.

c++ optimization performance caching strict-aliasing

114
推荐指数
9
解决办法
7276
查看次数

编译器会优化和重用变量吗?

例如,如果我有以下代码:

int main(){
  myClass a(...);
  a.doSomething();
  if(...){
    myClass c(...);
    c.doSomething();
  }
}
Run Code Online (Sandbox Code Playgroud)

像gcc或clang这样的通常编译器会优化这些变量的使用,发现"a"在它的生命周期中将不再使用,而不是为"c"重新分配空间,只需使用空间?如果这对于类不起作用,那么对于像double或size_t这样的"传统"类型是否有效?

我正在尝试最小化频繁调用函数的分配成本.但是在函数内部的某个地方,我觉得一些旧的变量已经没用了,但新变量不应该被称为该名称.编译器会直接重用变量给我,还是应该做类似的事情

myClass a(...);
something(a);
if(...){
  #define c a
  c=myClass(...);
  something c;
  #undef c
}
Run Code Online (Sandbox Code Playgroud)

c++ optimization gcc clang

1
推荐指数
1
解决办法
542
查看次数

标签 统计

c++ ×2

optimization ×2

caching ×1

clang ×1

gcc ×1

performance ×1

strict-aliasing ×1