【问题标题】:How can I concisely assign to the members of a struct depending on a condition?如何根据条件简明地分配给结构的成员?
【发布时间】:2016-08-25 05:04:00
【问题描述】:

我有一些看起来像这样的代码:

struct mystruct
{
    /* lots of members */
};

void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
    {
        /* initialize members individually a certain way */
    }
    else
    {
        /* initialize members individually another way */
    }
}

我正在考虑的选项:

  • 最简单的方法是拥有一个分配给每个成员并调用它的函数。我是否应该只希望编译器优化该调用?
  • 定义一个宏来显式避免函数调用开销。
  • 一切尽在不言中。

在 C11 中处理这种情况的正确方法是什么?

【问题讨论】:

  • 您所拥有的一切都没有问题。可读性很重要。你可以把一些线吊出来,例如dst->foo = condition ? 5 : 7; 但请考虑哪个选项可以让读者更清楚地了解发生了什么以及为什么。
  • 考虑在if 的每个分支中使用“复合文字”和“指定初始值设定项”:*dst = (struct mystruct) { .member1 = value1, .member2 = value2, … };
  • 如果struct 需要为const,您可以创建多个包含不同初始化列表的宏,然后在它们之间创建#ifdef。不漂亮,但没有其他选择。

标签: c if-statement struct initialization c11


【解决方案1】:

只需编写一个初始化成员的函数,或者如果您愿意(基于意见),使用 MACRO。

顺便说一句,我个人会这样做这样:

void mystruct_init( struct mystruct* dst, int const condition )
{
    if ( condition )
        init_first_way(..);
    else
        init_second_way(..);
}

或者只使用三元运算符。请记住,您关心可读性并始终牢记:

简单是一种美德!


我真的认为在这个阶段担心优化会让不成熟的优化成为受害者,因为我怀疑它会成为瓶颈。

一般来说,如果你想优化你的代码,分析你的代码(虽然它运行时带有优化标志,很多人不知道这一点,我就是其中之一:Poor performance of stl list on vs2015 while deleting nodes which contain iterator to self's position in list),找到瓶颈并尝试优化那个瓶颈。

【讨论】:

  • +1 用于提及immature optimization。如前所述,过早的优化是万恶之源 :) [c2.com/cgi/wiki?PrematureOptimization]
  • @Arun 这不是关于优化,而是关于简洁性。我对编译器优化不是很熟悉,所以我不想不必要地拥有一些效率较低的东西。不过,谢谢你们指出这一点,它提醒我在我还没测量过的时候就不要再担心这样的事情了。
  • @user2296177 去过那里,做过,看看我的编辑。不过,我感觉到让你问这个问题的风,这就是我投票的原因。
【解决方案2】:

我认为这里没有任何明确的规则。对我来说,这取决于作者的口味。

两种明显的方式是:

// initialize members that are independent of 'condition'

if (condition) {
  // initialize members one way
}
else {
  // initialize members another way
}

同样可以写成:

// initialize members that are independent of 'condition'

// initialize members based on 'condition'
dst->memberx = condition ? something : something_else;
// ...

请不要担心一个函数调用的开销。

【讨论】:

  • 最后一句话触动了我的心,太好了!
【解决方案3】:

我同意已经发布的答案(@gsamaras 和@Arun)。我只是想展示另一种我发现几次有用的方法。

方法是用两个(或多个)相关的初始化值制作一些常量,然后根据一个(或多个)条件进行简单的赋值。

简单示例:

#include<stdio.h>
#include <string.h>

struct mystruct
{
  int a;
  float b;
};

const struct mystruct initializer_a = { 1, 3.4 };
const struct mystruct initializer_b = { 5, 7.2 };

int main (void)
{
  int condition = 0;
  struct mystruct ms = condition ? initializer_a : initializer_b;
  printf("%d %f\n", ms.a, ms.b);
  return 1;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多