Many websites and questions on Stack Overflow reference a function named std::__gcd
. What’s the difference between this function and std::gcd
?

- 362,284
- 104
- 897
- 1,065
-
Names beginning with `_` are reserved for the implementation: [What are the rules about using an underscore in a C++ identifier?](https://stackoverflow.com/q/228783/995714) – phuclv Aug 13 '21 at 12:28
-
@phuclv Yes, that’s true, though some implementations will in turn export those names to programmers (see, for example, `__builtin_expect` or `__asm`). – templatetypedef Aug 13 '21 at 12:29
1 Answers
I did some sleuthing on this. It looks like the __gcd
function is a private helper function defined in the libstdc++ implementation of the <algorithm>
header (line 1503). It’s used internally only by the std::rotate
function (line 1610). It was (probably) never intended to be used directly outside of the library implementation. Because it’s specific to libstdc++, trying to use this function through compilers other than g++ isn’t guaranteed to work. In that sense, you can think of the std::__gcd
function as a (poorly documented) internal helper that’s only available with some C++ compilers.
(Fun fact: I was first alerted to the existence of __gcd
by a now-deleted question here asking why it handled negative inputs inconsistently. Turns out it wasn’t really designed to handle negative numbers, since the libstdc++ implementation only uses it in cases where the inputs are nonnegative. It’s one of the risks of using an undocumented internal helper function!)
On the other hand, std::gcd
is a standard C++ library function that was introduced in C++17. This means that any C++17-compliant compiler will support std::gcd
, so it’s preferable to use this option if you have a C++17-compliant compiler.
For C++14 or lower, you can simply implement your own version GCD function. Euclid’s algorithm is very straightforward to code up and runs extremely quickly.

- 362,284
- 104
- 897
- 1,065