3

以下来自 Chromium 源代码的代码片段引起了我的注意(请参见此处的第 155 行):

std::string PrintPreviewUI::GetPrintPreviewUIAddress() const {
  // Store the PrintPreviewUIAddress as a string.
  // "0x" + deadc0de + '\0' = 2 + 2 * sizeof(this) + 1;
  char preview_ui_addr[2 + (2 * sizeof(this)) + 1];
  base::snprintf(preview_ui_addr, sizeof(preview_ui_addr), "%p", this);
  return preview_ui_addr;
}

2 + (2 * sizeof(this)) + 1评价为3 + 2 * sizeof(this)?为什么作者选择这样写表达式?

4

4 回答 4

11

是的,它确实以相同的方式评估。

大概作者这样写是为了更清楚地说明他们的数组是如何布局的——即它包含 2 个字节用于一件事,然后是 2 个指针,然后再包含 1 个字节。(实际上我不确定他们为什么在这种情况下选择使用 sizeof() 运算符,因为指针的字符串表示的长度与指针的内存宽度不同)

编译器将在编译时优化数学,因此不会影响性能;这只是为了让其他程序员不必弄清楚 3 的来源。

于 2012-08-22T20:42:27.877 回答
2

是的,它是一样的,假设所有类型都是整数而不是浮点,就像在这种情况下一样(对于浮点,结果通常是相同的,但是有一些奇怪的边缘情况涉及当事情圆润的,会让你大吃一惊)。

为了清楚起见,作者可能选择这样写:他们在缓冲区中存储了一个特定的字符串,该字符串由两个字节构成,添加更多数据,然后再添加一个字节。以这种方式编写它允许代码阅读器通过一次匹配一个片段来轻松地仔细检查计算的大小是否确实与正在写入的数据量相匹配。

于 2012-08-22T20:43:26.217 回答
2

可能是为了可读性。写它的人试图表达 2 和 1 是两种不同的信息,而不是只有 3 并且不知道是什么组成的

于 2012-08-22T20:43:38.343 回答
0

这对编译过程的翻译阶段生成的汇编代码没有影响。

我能想到作者以这种方式编写代码的唯一真正原因可能是出于可读性的原因——也许这种方式的逻辑比作者在代码中实现此逻辑之前使用“代数简化”更清晰。

关于帖子标题的纯数学注释 - 是的 2 + x + 1 确实等于 x + 3。但是,与计算机编程不同,在数学(至少算术/代数)中说 x 永远是无效的= x + 1 :-)

于 2012-08-22T20:47:27.110 回答