了解 Getchar 解锁
Understanding Getchar unlocked
我是竞争性编程的新手,我发现很多人几乎在他们提交的每一个提交中都使用以下代码片段。
#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。在竞争性编程和其他应用程序中使用此代码的逻辑是什么?
是的,此代码在大多数情况下比标准库实现更高效。它对输入进行了更多假设,这使其更加脆弱,但允许进行额外的优化。这些假设是:数字始终为十进制,由单个非数字字符分隔,任何第二个分隔字符始终为负号,数字始终小到足以放入 int
。这些假设在编程竞赛中是可以接受的,但在大多数情况下不应以其他方式使用。
getchar
只是一个 returns 来自缓冲输入的单个字符的函数。 _unlocked
是一个跳过同步的版本,可以更快,但在多线程读取输入的情况下会导致不可预测的行为。
通过自己进行缓冲并避免对每个字符调用库,此代码可能会变得更快。不过这样做可能不值得。
我是竞争性编程的新手,我发现很多人几乎在他们提交的每一个提交中都使用以下代码片段。
#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。在竞争性编程和其他应用程序中使用此代码的逻辑是什么?
是的,此代码在大多数情况下比标准库实现更高效。它对输入进行了更多假设,这使其更加脆弱,但允许进行额外的优化。这些假设是:数字始终为十进制,由单个非数字字符分隔,任何第二个分隔字符始终为负号,数字始终小到足以放入 int
。这些假设在编程竞赛中是可以接受的,但在大多数情况下不应以其他方式使用。
getchar
只是一个 returns 来自缓冲输入的单个字符的函数。 _unlocked
是一个跳过同步的版本,可以更快,但在多线程读取输入的情况下会导致不可预测的行为。
通过自己进行缓冲并避免对每个字符调用库,此代码可能会变得更快。不过这样做可能不值得。