我应该使用字符串还是char []?

Joh*_*nny 0 c++ memory string char

所以我希望有一个像这样的结构数组的缓冲区:

EventItem
{
   tag; // some string or array of characters to describe the value;
   value; // some integer or something

}
Run Code Online (Sandbox Code Playgroud)

值可以是int32之类的值.我关心的是标签.如果我有这些对象的数组,并且我将标记设为字符串,那么如果用户将EventItem输入到具有长标记的缓冲区中会发生什么?是否会导致缓冲区或其中的一部分被复制到内存中的其他位置以保存这个更大的EventItem(因为这个长字符串更大)?

通过使用数组而不是字符串来使用固定数量的字符来限制标记会更好吗?

显然我并不确切地知道我在说什么,但我不知道如何在不知道EventItems大小的情况下用适当数量的连续空间创建缓冲区.

有人可以解释一下这种情况会对我有什么影响吗?

首先十分感谢!

Tom*_*Tom 7

你想要的是一个std::string.

不仅因为它的c ++而不是c,还因为在std::strings上运行比在on上容易得多char[].

此外,结构的构造可能更容易也更简单,避免复制 char[]

struct EventItem{

   EventItem(const int_32 value,const std::string&tag):m_value(value),m_tag(tag){}

   int_32 m_value;
   std::string m_tag;
};
Run Code Online (Sandbox Code Playgroud)

我关心的是标签.如果我有这些对象的数组,并且我将标记设为字符串,那么如果用户将EventItem输入到具有长标记的缓冲区中会发生什么?是否会导致缓冲区或其中的一部分被复制到内存中的其他位置以保存这个更大的EventItem(因为这个长字符串更大)?

不清楚(IMO),但我倾向于"不,不要担心它".可能发生的唯一方法是缓冲区跨越页面边界(假设此处有分页内存).好吧,如果它发生了,它就会发生.虚拟内存的奇迹将照顾它.

显然我并不确切地知道我在说什么,但我不知道如何在不知道EventItems大小的情况下用适当数量的连续空间创建缓冲区.

让我们std::vector来处理.当然,总是可能出现连续空间可能无法获得的情况.你为什么这么担心 你能解释一下这会成为问题的情况吗?

  • 请使用const引用作为值参数.虽然不方便,但这应该是首先要学习的东西. (2认同)