我的第一篇文章,请善待:)
此代码段来自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有什么好处,而不是仅仅声明一个?
不要质疑作者,只是试图了解采取这种方式可能带来的好处。是否有速度或效率的好处?
答案 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::string
,std::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
。使用与要比较的值相同的类型也是一件好事。