libstdc++: Avoid zeroing stack buffer in std::bitset extraction
Improves efficiency by avoiding unnecessary zero-initialization of a stack buffer in std::bitset extraction.
A stack buffer used for istream extraction in std::bitset will no longer be zero-initialized. This change uses the [[indeterminate]] attribute (or __attribute__((uninitialized)) for C++98 compatibility) to mark the buffer as uninitialized, avoiding an unnecessary zeroing operation. Additionally, a new variable for the array length is introduced to prevent -Walloc-size warnings related to zero-sized allocations in C++98.
In Details
The std::bitset::operator>> in libstdc++ uses a temporary stack buffer for istream extraction. This buffer was implicitly zero-initialized, which is unnecessary as it's immediately overwritten. To avoid this, the [[indeterminate]] attribute (C++20) or __attribute__((uninitialized)) (C++98) is applied. A related issue with new _CharT[0] in C++98, which triggered -Walloc-size, is resolved by ensuring a non-zero array length variable is used.
- std::bitset
- A C++ standard library class that can store and manipulate bits.
- istream extraction operator (>>)
- An operator used to read data from an input stream (like std::cin) into a variable.
- stack buffer
- A temporary region of memory allocated on the call stack, typically for local variables within a function.
- zero-initialization
- The process of initializing memory to all zero bits.
- [[indeterminate]] attribute
- A C++20 attribute that indicates a variable or object is not initialized, preventing the compiler from assuming a default initial state.
- __attribute__((uninitialized))
- A GCC-specific attribute that marks a variable as uninitialized, similar to the C++20 [[indeterminate]] attribute.
- -Walloc-size
- A GCC warning flag that detects potential issues with memory allocation sizes, such as allocating zero bytes.