在多个来源中,sizeof时间常数

时间:2017-01-02 19:39:39

标签: c

我要求您就&size;' sizeof'什么时候 它出现在多个源文件中,并以相同的类型运行。 例如,在我的代码中,我需要

sizeof(float) * MY_CONSTANT

在几个地方(例如,用于内存分配或将其传递给glBufferData()调用)我正在考虑为此编写一个宏:

#define FLT_TIMES_MY_CONSTANT (sizeof(float)*MY_CONSTANT)

这会给我带来编译速度方面的任何好处吗?您是否有任何可以想到的缺点(例如,我需要在所有来源中包含一个带有该定义的标题)?

此致 阿尔弗雷德

5 个答案:

答案 0 :(得分:1)

不,这是微优化。如果代码明确提供了好处,您应该只手动优化代码。如果您发现使用其中一种更好的风格,请使用您喜欢的那种。你也不应该担心编译速度。您主要关注的应该是运行时速度,这两种方法都不会受到任何影响。

答案 1 :(得分:1)

根据我的知识,将*.sp[abd]定义为宏不会给编译速度带来任何好处,事实上,由于预处理,它可能会略微降低编译速度。

编译分4个阶段/步骤进行:

  1. 预处理
  2. 汇编
  3. 装配
  4. 链接
  5. 在预处理阶段,宏用它们代表的代码替换。通过定义宏#define FLT_TIMES_MY_CONSTANT (sizeof(float)*MY_CONSTANT),您只需在代码中添加一个必须替换的宏,这就增加了需要在预处理阶段完成的工作。当然,鉴于这是一个简单的替代品,进行这种替换的时间可能很短,但你肯定不会看到加速。

    在我看来,你不应该为了试图加速你的编译而包含一个宏,而是为了试图加速开发,因为宏会减少你必须花费多少时间来写出来代码。

    有关编译阶段的更多信息,这可能是一个很好的资源来阅读:http://placementyogi.com/tutorials/c/c-basics/c-program-compilation-steps

答案 2 :(得分:0)

在编译过程之前将替换所有宏。您可以使用MACRO替换函数调用以进行一些优化

{ "thumbnail": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+P+/HgAFhAJ/wlseKgAAAABJRU5ErkJggg==", "metadataKey1": "some data", "metadataKey2": "some other data" }

答案 3 :(得分:0)

在新宏中打包常量定义是一种很好的编程习惯。 它对编译速度没有任何贡献,而是使代码更具可读性。在预编译过程之后,宏按原样放入源代码中。

您需要将所有共享宏定义放入单独的头文件中,并将它们包含在需要它们的源文件中。

您应该注意 sizeof ,因为它返回的内容可能会根据您编译的平台而改变。例如,在16位微处理器环境中sizeof(int)返回2,但在32位处理器的情况下,它返回4.

答案 4 :(得分:0)

假设您要将返回的地址存储在float指针中,我强烈推荐这种风格:

float *buffer = malloc(MY_CONSTANT * sizeof *buffer);

这只使用普通数字MY_CONSTANT,而"锁定"缩放到目标指针的类型。如果您将左侧更改为:

double *buffer = ...

它仍然可以正常工作,没有任何东西被隐藏。