我要求您就&size;' sizeof'什么时候 它出现在多个源文件中,并以相同的类型运行。 例如,在我的代码中,我需要
sizeof(float) * MY_CONSTANT
在几个地方(例如,用于内存分配或将其传递给glBufferData()调用)我正在考虑为此编写一个宏:
#define FLT_TIMES_MY_CONSTANT (sizeof(float)*MY_CONSTANT)
这会给我带来编译速度方面的任何好处吗?您是否有任何可以想到的缺点(例如,我需要在所有来源中包含一个带有该定义的标题)?
此致 阿尔弗雷德
答案 0 :(得分:1)
不,这是微优化。如果代码明确提供了好处,您应该只手动优化代码。如果您发现使用其中一种更好的风格,请使用您喜欢的那种。你也不应该担心编译速度。您主要关注的应该是运行时速度,这两种方法都不会受到任何影响。
答案 1 :(得分:1)
根据我的知识,将*.sp[abd]
定义为宏不会给编译速度带来任何好处,事实上,由于预处理,它可能会略微降低编译速度。
编译分4个阶段/步骤进行:
在预处理阶段,宏用它们代表的代码替换。通过定义宏#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 = ...
它仍然可以正常工作,没有任何东西被隐藏。