3

我有一个局部变量,仅用于检查另一个函数的结果并在满足某些条件时将其传递。大多数时候,这个标准永远不会得到满足。有什么办法可以避免这种“额外”的地方?

我的二进制文件只有大约 1MB 的存储空间,而且我有数千个遵循这种模式的函数调用。我知道这是一件小事,但如果有更好的模式,我很想知道!

SomeDataType myclass::myFunction()
{
   SomeDataType result;  // do I really need this local???

   // i need to check the result and pass it on if it meets a certain condition
   result = doSomething();
   if ( ! result ) {
      return result;
   }

   // do other things here
   ...

   // normal result of processing
   return SomeDataType(whatever);
}
4

10 回答 10

4

有多复杂SomeDataType?它有很多成员吗?它在构造函数中做了很多工作吗?如果是这样,那么我会避免这种情况。如果没有,您可能会发现编译器会为此生成好的代码。例如,编译器可能会很好地处理整数类型。

对于这样的问题,答案几乎总是:查阅编译器的汇编输出。

于 2010-03-04T09:01:16.090 回答
1

我会反汇编代码并弄清楚你的编译器在生成代码时在做什么。现代编译器做了一些棘手的事情,试图猜测如何节省代码空间并不明显——有时我看到从源代码到程序集的对应关系很少。源代码更多的是关于清晰度和维护 - 生成程序集有不同的指标。

于 2010-03-15T14:53:50.237 回答
1

如果将功能更改为

void myclass::myFunction(SomeDataType* pResult)
{
  // i need to check the result and pass it on if it meets a certain condition
   *pResult = doSomething();
   if ( ! *pResult ) {
      return;
   }

   // do other things here
   ...

   // normal result of processing
  *pResult = SomeDataType(whatever);
}
于 2010-03-04T09:25:36.797 回答
1

取决于你的编译器是否有返回值优化,以及 Somedatatype 是大还是小。如果对象很大,安全的一面是对这种模式使用智能指针。如果它们是 POD,它们可能会被优化并返回到寄存器中。

于 2010-03-04T09:10:31.157 回答
1

如果你没有在函数的其他地方使用结果变量,你可以试试这个:

if (!doSomething())
{
    return;
}

上面的示例允许编译器在必要时创建临时变量,而不是您告诉编译器创建一个。

如果你是结构化编程的忠实拥护者,你可以试试这个:

do
{
    if (!doSomething())
    {
        break;
    }
// ...
} while (false);
return;

此示例仅允许函数中有一个返回点。在处理质量和可追溯性指南时,这可能是一件好事。

于 2010-03-04T17:54:17.317 回答
0

在调用 doSomething() 时,您可以返回 SomeDataType(whatever),而不是返回 null。

于 2010-04-21T18:36:14.120 回答
0

我建议你不要担心。在这个级别进行优化并不是一个很好的利用时间,因为任何体面的编译器都会最大限度地减少所需的本地存储量。堆栈是可重用的,数以千计的调用无关紧要,因为内存只在使用它的上下文中需要,除此之外不会相关。

如果你真的需要关心堆栈上的几个字节临时存储,你可能应该在汇编中工作。我怀疑情况是否如此,所以不要出汗,把时间花在其他更有趣和更重要的问题上!

于 2010-04-28T23:03:51.557 回答
0

我建议您检查您的编译器选项并确保将它们设置为“优化大小”,​​因为这是您所担心的。如果你的编译器没有这样的设置,那么也许是时候检查一个不同的了。

于 2010-03-17T02:35:49.153 回答
0

如果您有一个在数千个函数中重复的模式,您可以考虑将其替换为一个函数和一个查找表。

(如果不了解您的情况的更多详细信息,我真的无法更具体。)

于 2010-03-09T04:25:47.480 回答
0

正如 asveikau 所指出的,如果 SomeDataType 将“放入寄存器”(例如它是一个普通的旧 int),那么您的本地将(取决于平台)不会浪费任何内存。我同意 asveikau 的观点,即您应该查阅汇编输出以评估是否是这种情况。

于 2010-03-04T09:07:05.907 回答