std :: size_t实例化

时间:2011-08-21 04:50:40

标签: c++

我的第一篇文章,请善待:)

此代码段来自Poco库项目:

void SyslogParser::parse(const std::string& msg)
{
// <int> -> int: lower 3 bits severity, upper bits: facility
std::size_t pos = 0;
RemoteSyslogChannel::Severity severity;
RemoteSyslogChannel::Facility fac;
parsePrio(msg, pos, severity, fac);

// the next field decide if we parse an old BSD message or a new syslog message
// BSD: expects a month value in string form: Jan, Feb...
// SYSLOG expects a version number: 1

if (Poco::Ascii::isDigit(msg[pos]))
{
    parseNew(msg, severity, fac, pos);
}
else
{
    parseBSD(msg, severity, fac, pos);
}
poco_assert (pos == msg.size());
}

我不明白std :: size_t在这里的作用。我认为std :: size_t会创建一个对象(uint32或uint64,具体取决于平台等),它可以保存其他对象的大小。这种理解是否正确?

那么,这里发生的是,我们正在创建一个uint并且(看起来)使用它作为位域。如果我理解正在做什么,那么我不得不问为什么?以这种方式生成uint有什么好处,而不是仅仅声明一个?

不要质疑作者,只是试图了解采取这种方式可能带来的好处。是否有速度或效率的好处?

3 个答案:

答案 0 :(得分:2)

我认为std::size_t会创建一个对象(uint32或uint64,具体取决于平台等),它可以保存其他对象的大小。这种理解是否正确?

是的
std::size_t是一种类型,可用于保存C / C ++程序中任何对象的大小。

通常函数使用std::size_t类型作为接收对象/类型大小作为函数参数的标准方式。由于poco库函数使用std::size_t作为类型,调用者需要在调用这些函数时创建具有相同类型的参数。

答案 1 :(得分:2)

我认为第3行的评论具有误导性,应该删除。

顾名思义,

pos是已经解析字符串的字符串中的位置。最后,必须解析整个字符串,这就是所有parse*函数(可能)增加该变量的原因。这里没有涉及的位域。

也许您认为创建类型std::size_t的对象是一项昂贵的操作,因为该命名空间中的许多其他类型确实可能很昂贵,例如std::stringstd::map。但事实并非如此。 std::size_t是一种非常便宜的数据类型。

代码应该看起来像这样:

void SyslogParser::parse(const std::string& msg)
{
  std::size_t pos = 0;

  // <int> -> int: lower 3 bits severity, upper bits: facility
  RemoteSyslogChannel::Severity severity;
  RemoteSyslogChannel::Facility fac;
  parsePrio(msg, pos, severity, fac);
...

答案 2 :(得分:1)

据我所知,parsePrio()函数通过引用获取pos参数,因此调用代码必须使用函数所期望的完全相同的类型。此外,std::string::size()函数返回类型std::string::size_type的值,通常为std::size_t。使用与要比较的值相同的类型也是一件好事。