在声明或在单独的函数中初始化struct

时间:2016-06-15 21:50:09

标签: c performance struct initialization arm

当我开始使用GUI库时,我正在使用C语言中的一堆结构。我很难决定如何初始化结构。以下是两种情况:

#define GUI_CreateBox(PageName,x,y,z,w,h,color) \
  struct GUI_BOX BoxName = {x,y,z,w,h,color}

static void GUI_InitBox(struct GUI_BOX *box,uint32_t x, ... uint32_t color)
{
  init code
}

我的问题是,哪一个会使用最少的代码空间?我认为功能会更好。我想使用define,因为它会比取消引用struct指针快很多倍。我只是不明白结构的初始化是如何工作的,并且在我继续之前想要第二个意见。

每个人都在想什么?

还有一些背景信息。我将研究ARM Cortex M-4设备。我想要一个漂亮的图书馆。

2 个答案:

答案 0 :(得分:0)

您将进行多少次这些特定的初始化?这些初始化有多少变化你会做什么?这可能会影响为您提供最少代码的内容。哪些需要适用于全局(文件)范围的变量?您可以在文件范围内使用宏;您无法在文件范围内使用该函数 - 函数调用必须在函数体内进行,这也会导致出现关于"变量初始化时的问题"。

请注意,宏版本意味着您编写:

GUI_CreateBox(box1, 23, 45, 20, 30, 20, COLOUR_BLUE);

但功能版本意味着你可以写:

struct GUI_Box box2;
GUI_InitBox(&box2, 23, 45, 20, 30, 20, COLOUR_GREEN);
…some code using box2…
GUI_InitBox(&box2, 32, 54, 2, 3, 2, COLOUR_PURPLE);
…more code using box2…

这也让你可以选择不初始化结构;这可能不是一个好主意。

您的选择。他们之间没有太多选择。

您也可以考虑复合文字:

#define GUI_INITBOX(x, y, z, h, w, c) \
    (struct GUI_BOX){ .x = (x), .y = (y), .z = (z), .h = (h), .w = (w), .color = (c) }

然后你写了:

struct GUI_BOX box1 = GUI_INITBOX(23, 45, 20, 30, 20, COLOUR_BLUE);

声明并初始化,你可以写:

struct GUI_BOX box2;
…code…;
box2 = GUI_INITBOX(23, 45, 20, 30, 20, COLOUR_GREEN);

稍后分配(不初始化)box2。复合文字(和指定的初始化程序)是C99的一部分,因此也是C11。

答案 1 :(得分:0)

你必须考虑这样一个事实,即你不会一次初始化。就代码大小而言,由于初始化例程只有赋值,因此宏会更小。此外,您不必使用函数调用,也不需要传递一堆或参数,您可以节省堆栈大小和吞吐量。

但您要考虑的一个主要问题是有多少人会使用您的图书馆。当人们使用由大量宏组成的库时,我已经遇到过很多次。您的参数没有保护(参数类型检查),这显然会导致错误的对象初始化。

仅就这一点而言,我总是在安全方面犯错,并且在一个函数中执行此操作,尤其是当您考虑到这一点时

虽然这不适用于您的示例,但如果您计划在像macro这样的函数中多次重复使用单个参数,则可能会为喜欢在参数中执行操作的人带来一些意想不到的副作用。 / p>