gpt4 book ai didi

c++ - 引用的条件分配

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:43 26 4
gpt4 key购买 nike

有比我对C++标准理解更深的人可以详细说明一下吗?

这是我的示例程序

#include <string>
#include <iostream>

int main(int argc, char* argv[]) {
const std::string message("hello world");
std::cout << std::hex << (void*)message.c_str() << std::endl;
const std::string& toPrint = (argc > 0) ? message : "";
std::cout << std::hex << (void*)toPrint.c_str() << std::endl;
return 0;
}

在一台机器上它这样做:

# g++ --version && g++ str_test.cpp && ./a.out                  
g++ (Debian 4.7.2-5) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0x9851014
0x9851014

messagetoPrint 似乎指的是我所期望的同一个实例。然而,在另一台机器上,会发生这种情况:

# g++ --version && g++ str_test.cpp && ./a.out 
g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0x7ffeb9ab4ac0
0x7ffeb9ab4ae0

这里看起来编译器为 toPrint 构造了一个 message 的拷贝以指向。

根据 C++ 标准,什么行为是正确的?还是一般未定义?

最佳答案

您对 GLIBC 的写时复制字符串共享感到困惑。将您的测试程序更改为:

#include <string>
#include <iostream>

int main(int argc, char* argv[]) {
const std::string message("hello world");
std::cout << std::hex << (void*)&message << std::endl;
const std::string& toPrint = (argc > 0) ? message : "";
std::cout << std::hex << (void*)&toPrint << std::endl;
return 0;
}

(换句话说打印字符串对象的地址,而不是包含文本的地址),两个平台将返回不同的地址。

最新的标准已经禁止写时复制(虽然我不明白到底是怎么回事)。在此之前,这是合法的,但不是强制性的。 (当前的想法是“小字符串优化”比 cow 做得更好——尤其是在多线程世界中)。

关于c++ - 引用的条件分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34785505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com