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

时间:2010-08-22 03:58:53

标签: c++ string memory char

所以我想要一个带有这样结构数组的缓冲区:

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

}

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

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

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

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

非常感谢!

4 个答案:

答案 0 :(得分:7)

你想要的是std::string

不仅因为它的c ++而不是c,还因为在std::string上操作比在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;
};
  

我关心的是标签。   如果我有这些对象的数组,   我把标签变成了一个字符串,什么   如果用户输入了一个   EventItem进入这个缓冲区有一个   长标签?这会导致缓冲区   或要复制的部分内容   在记忆中的其他地方举行这个   更大的EventItem(更大因为   这个长串)?

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

  

显然我不确切知道是什么   我在谈论,但我不知道   如何使用。创建缓冲区   适量的连续空间   不知道的大小   EventItems提前。

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

答案 1 :(得分:2)

  

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

如果你正在使用std :: string,那么无论你对字符串成员做什么,EventItem本身都不会增加(或减少)。 std :: string通过将其存储在别处来管理其实际内容。在里面它可能包含指向其他地方分配的内存的指针(可能使用new)。如果它需要扩展以存储更多内容,它只需分配新内存,复制数据并释放旧内存。 std :: string对象本身总是保持相同的大小。

这几乎适用于C ++中的所有内容。 std :: vector,std :: list等。基本上任何以某种方式似乎动态扩展以存储越来越多内容的对象实际上都是使用指针而new将内容存储在其他位置。

另一方面,如果您将自己的指针存储在std :: string或std :: vector等对象内部管理的某些内容中,则必须要小心。向这样的容器添加更多元素时,整个集合可能最终被复制到别处,从而使指针无效。

因此,如果您可能拥有std :: vector,那么无论何时向该向量添加另一个EventItem,它都可能将整个组移动到内存中的其他位置。但是当然如果你只是通过向量的方法访问这些元素(例如at()或operator [])那么你甚至都不会注意到它们之间的区别。

答案 2 :(得分:0)

这取决于缓冲区需要包含的内容。通常,不允许数据缓冲区内部有实际指针。这就排除了数据结构,就像std::string一样简单。如果这不是一项要求,请重新考虑您是否确实需要一个平面数据缓冲区。

具有字符串固定分配的数据缓冲区在C ++中没有位置。小嵌入式系统,是的。通常这些应用程序不涉及“描述价值”。

最有可能的情况是,您应该使用数组,缓冲区,char[]和持久性原始指针的应用程序,以支持vectorstring和托管结构。

答案 3 :(得分:-1)

两个都很糟糕。请改用QString