了解 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
只是一个从缓冲输入返回单个字符的函数。 _unlocked
是一个跳过同步并且可以更快的版本,但在多个线程读取输入的情况下会导致不可预测的行为。
通过自己进行缓冲并避免对每个字符进行库调用,可以更快地编写此代码。不过,这样做可能不值得。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗
- 了解 Getchar 已解锁