Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:是2+;x+;1与3+相同;x?_C++_Google Chrome - Fatal编程技术网

C++ C++;:是2+;x+;1与3+相同;x?

C++ C++;:是2+;x+;1与3+相同;x?,c++,google-chrome,C++,Google Chrome,以下来自Chromium源代码的代码片段引起了我的注意(参见第155行): 是否将2+(2*sizeof(this))+1计算为3+2*sizeof(this)?为什么作者选择这样写表达式?是的,它的计算方法是相同的 据推测,作者这样写是为了更清楚地展示他们的数组是如何布局的——也就是说,一个数组包含2个字节,然后是2个指针,然后再包含1个字节。(实际上,我不知道他们为什么选择在本例中使用sizeof()运算符,因为指针的字符串表示形式的长度与指针在内存中的宽度不同) 编译器将在编译时优化数学运

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


是否将
2+(2*sizeof(this))+1计算为
3+2*sizeof(this)
?为什么作者选择这样写表达式?

是的,它的计算方法是相同的

据推测,作者这样写是为了更清楚地展示他们的数组是如何布局的——也就是说,一个数组包含2个字节,然后是2个指针,然后再包含1个字节。(实际上,我不知道他们为什么选择在本例中使用sizeof()运算符,因为指针的字符串表示形式的长度与指针在内存中的宽度不同)


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

是的,假设所有类型都是整数而不是浮点,就像在本例中一样(对于浮点运算,结果通常是一样的,但是当事物被四舍五入时会出现一些奇怪的边缘情况,这会让你感到惊讶)


作者可能选择这样写是为了清楚:他们在缓冲区中存储了一个特定的字符串,这个字符串是通过取两个字节,再添加一些数据,然后再添加一个字节来构建的。这样写可以让代码读取器轻松地双重检查计算的大小是否确实与正在处理的数据量相匹配通过一次匹配一个片段来编写。

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

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

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


关于这篇文章的标题,从纯数学的角度来看——是的,2+x+1确实等于x+3。然而,与计算机编程不同的是,在数学(至少是算术/代数)中,x=x+1:-)从来都是无效的。

你没有看到上面一行的评论吗?@CharlesBailey:我想我不明白!它显示了表达式背后的推理,因此您不必怀疑您建议的替代方案中的魔法
3
。当然,您应该真正避免上述所有情况。该函数似乎等价于:
std::ostringstream buf;buf注意:
sizeof(this)
sizeof(*this)
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;
}