【问题标题】:Understanding Getchar unlocked了解 Getchar 已解锁
【发布时间】:2015-01-12 10:04:00
【问题描述】:

我是竞争性编程的新手,我发现许多人几乎在他们提交的每个提交中都使用以下 sn-p 代码。

#define gc getchar_unlocked
int readint()

{
    int f=0,ret=0;
    char c=gc();
    while(c<'0'||c>'9')
        c=gc();
    while(c>='0'&&c<='9')
    {
        ret=ret*10+c-48;
        c=gc();
    }
    return f?-ret:ret;
}

此代码是否确保快速 I/O。在竞争性编程和其他应用程序中使用此代码的逻辑是什么?

【问题讨论】:

    标签: c++ c algorithm


    【解决方案1】:

    是的,在大多数情况下,此代码将比标准库实现更有效。它对输入做出更多假设,这使得它更加脆弱,但允许额外的优化。这些假设是:数字始终为十进制,由单个非数字字符分隔,任何第二个分隔字符始终为减号,数字始终小到足以放入 int。这些假设在编程竞赛中是可以接受的,但在大多数情况下不应该用于其他情况。

    getchar 只是一个从缓冲输入返回单个字符的函数。 _unlocked 是一个跳过同步的版本,速度更快,但在多线程读取输入的情况下会导致不可预知的行为。

    通过自己进行缓冲并避免对每个字符进行库调用,此代码可能会变得更快。不过这样做可能不值得。

    【讨论】:

      猜你喜欢
      • 2021-03-26
      • 2015-09-26
      • 1970-01-01
      • 2019-08-10
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2019-05-10
      相关资源
      最近更新 更多