当您多次声明相同的对象/变量(新手)时会发生什么
what happens when you declare the same object/variable more than once (newbie)
这样的事情有什么作用?
static int i;
// wrapped in a big loop
void update_text()
{
std::stringstream ss; // this gets called again and again
++i;
ss << i;
text = new_text(ss.str()); // text and new_text are defined elsewhere
show_text(text); // so is this
}
是否在堆栈中创建具有新地址和所有内容的新 SS 实例? 将 Sprintf 与 char 数组一起使用会更聪明吗?
每次调用该函数时,都会在堆栈上推送一个新的本地std::stringstream ss
实例。在函数结束时,此实例将被销毁并从堆栈中弹出。
在任何时候,函数的作用域update_text
在其作用域中都不能有多个变量,标识符ss
。因此,在update_text
范围内,只有一个ss
标识符。
字符数组不会有任何区别。每次调用该函数时,char 数组(如果静态分配(将被推送到堆栈上并在末尾弹出。如果使用动态内存并动态分配字符数组,则每次调用函数时仍会执行 new
和 delete
语句,并且指向此字符数组的指针仍将被推送并从堆栈中弹出。std::stringstream
已经在内部为您处理new
和delete
。
多次声明一个对象将如下所示:
void Function()
{
int x;
int x;
}
这将导致编译器错误。
请注意,这是有效的:
void Function()
{
int x;
if(true)
{
int x;
}
}
因为这两个变量的作用域不同。第二个x
仅存在于该if
语句中。因此,编译器可以推断出在该声明之后和该范围内对x
的任何引用都指向第二个x
。请注意,类型无关紧要,重要的是标识符或"名称"。
小点:你的问题不是关于声明一个对象不止一次,而是遇到一个对象被初始化多次的位置。
所以回答你的真正问题:是的,每次调用函数时,它都会创建新的ss
实例(尽管如果从循环调用它,地址实际上可能是相同的,但这对程序员来说真的无关紧要(。
对于您的第二个问题:将sprintf
与字符数组一起使用会更聪明吗?好吧,如果你是 c++ 的新手,你应该从中得到的答案是否定的,因为sprintf
使用起来比streams
更危险(缺乏类型安全,溢出风险(。实际的答案是视情况而定。如果您知道自己在做什么,并且使用stringstreams
获得的性能不足以满足您的目的(这种情况应该很少发生(,请使用sprintf
。此外,请注意,您可以重用stringstreams
,这减少了每次创建新投射的开销(这对于流式传输单个int
非常重要(,您还可以查看此类投射的Boost.Lexical_Cast
。根据他们的性能部分,对于将int
转换为string
之类的事情,它应该与sprintf
一样快(我自己没有测试过,所以没有保证(,而不会暴露缺乏类型安全(和缓冲区溢出的风险(sprintf
。C++11 也有 std::to_string
,它可以在不放弃安全性的情况下进行转换(但是它的灵活性远不如 boost::lexical_cast'(。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 什么是"MFC Dialog Extension"?(Windows/C++ 新手 - Linux 背景)
- 我做错了什么?C++新手在这里
- 新手在这里,到底什么是 acquireLock(),它的目的是什么?
- 我是C++的新手,需要知道第10、12和16行中发生了什么
- 当您多次声明相同的对象/变量(新手)时会发生什么
- 什么是更好的Matrixx4类设计c++新手
- 这段代码有什么问题?我是 c++ 的新手!
- 指针新手,它们之间有什么区别?