c – 无法禁用std :: string的返回值优化?
发布时间:2020-12-16 09:48:31 所属栏目:百科 来源:网络整理
导读:鉴于这个最小的例子. #include iostream#include stringvoid print_ptr(const std::string s){ const char* data = s.data(); std::cout "ptr: " (void*)data std::endl;}std::string str_return(const char* suffix){ std::string s("prefix"); s += " "; s
鉴于这个最小的例子.
#include <iostream> #include <string> void print_ptr(const std::string& s) { const char* data = s.data(); std::cout << "ptr: " << (void*)data << std::endl; } std::string str_return(const char* suffix) { std::string s("prefix"); s += " "; s += suffix; print_ptr(s); return s; } int main() { std::string s = str_return("suffix"),t; print_ptr(s); t = str_return("suffix2"); print_ptr(t); return 0; } 我这样编译: g++ -std=c++98 -fno-elide-constructors -g -Wall str_return.cpp -o str_return 我的g: gcc version 4.7.1 输出: ptr: 0x804b04c ptr: 0x804b04c ptr: 0x804b07c ptr: 0x804b07c 为什么指针仍然相等? >它不应该是返回值优化 – 我关闭它 如何禁用此行为? 解决方法
返回值优化会影响本地对象(str_return函数中的s).你永远不会那样.
字符串对象本身管理动态内存,并选择在返回时将该托管内存交给下一个字符串.您正在检测的是管理内存.明智地说,这不会改变. 如果你真的想看到RVO的效果,请检测本地对象: #include <iostream> #include <string> void print_ptr(const std::string& s) { std::cout << "ptr: " << static_cast<const void *>(&s) << std::endl; } std::string str_return(const char* suffix) { std::string s("prefix"); s += " "; s += suffix; print_ptr(s); return s; } int main() { std::string s = str_return("suffix"); print_ptr(s); std::string t = str_return("suffix2"); print_ptr(t); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |