X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Fdoc%2Fhtml%2Fmanual%2Fbitset.html;fp=libstdc%2B%2B-v3%2Fdoc%2Fhtml%2Fmanual%2Fbitset.html;h=fcdba6d2358ac395fcf6682bc218afa345abed71;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=0000000000000000000000000000000000000000;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/doc/html/manual/bitset.html b/libstdc++-v3/doc/html/manual/bitset.html new file mode 100644 index 00000000..fcdba6d2 --- /dev/null +++ b/libstdc++-v3/doc/html/manual/bitset.html @@ -0,0 +1,105 @@ + + +
+ No, you cannot write code of the form +
+ #include <bitset> + + void foo (size_t n) + { + std::bitset<n> bits; + .... + } +
+ because n
must be known at compile time. Your
+ compiler is correct; it is not a bug. That's the way templates
+ work. (Yes, it is a feature.)
+
+ There are a couple of ways to handle this kind of thing. Please + consider all of them before passing judgement. They include, in + no particular order: +
A very large N in bitset<N>
.
A container<bool>.
Extremely weird solutions.
+ A very large N in
+ bitset<N>
.  It has been
+ pointed out a few times in newsgroups that N bits only takes up
+ (N/8) bytes on most systems, and division by a factor of eight is
+ pretty impressive when speaking of memory. Half a megabyte given
+ over to a bitset (recall that there is zero space overhead for
+ housekeeping info; it is known at compile time exactly how large
+ the set is) will hold over four million bits. If you're using
+ those bits as status flags (e.g.,
+ âchangedâ/âunchangedâ flags), that's a
+ lot of state.
+
+ You can then keep track of the âmaximum bit usedâ + during some testing runs on representative data, make note of how + many of those bits really need to be there, and then reduce N to + a smaller number. Leave some extra space, of course. (If you + plan to write code like the incorrect example above, where the + bitset is a local variable, then you may have to talk your + compiler into allowing that much stack space; there may be zero + space overhead, but it's all allocated inside the object.) +
+ A container<bool>.  The
+ Committee made provision for the space savings possible with that
+ (N/8) usage previously mentioned, so that you don't have to do
+ wasteful things like Container<char>
or
+ Container<short int>
. Specifically,
+ vector<bool>
is required to be specialized for
+ that space savings.
+
+ The problem is that vector<bool>
doesn't
+ behave like a normal vector anymore. There have been recent
+ journal articles which discuss the problems (the ones by Herb
+ Sutter in the May and July/August 1999 issues of C++ Report cover
+ it well). Future revisions of the ISO C++ Standard will change
+ the requirement for vector<bool>
+ specialization. In the meantime, deque<bool>
+ is recommended (although its behavior is sane, you probably will
+ not get the space savings, but the allocation scheme is different
+ than that of vector).
+
+ Extremely weird solutions.  If
+ you have access to the compiler and linker at runtime, you can do
+ something insane, like figuring out just how many bits you need,
+ then writing a temporary source code file. That file contains an
+ instantiation of bitset
for the required number of
+ bits, inside some wrapper functions with unchanging signatures.
+ Have your program then call the compiler on that file using
+ Position Independent Code, then open the newly-created object
+ file and load those wrapper functions. You'll have an
+ instantiation of bitset<N>
for the exact
+ N
that you need at the time. Don't forget to delete
+ the temporary files. (Yes, this can be, and
+ has been, done.)
+
+ This would be the approach of either a visionary genius or a + raving lunatic, depending on your programming and management + style. Probably the latter. +
+ Which of the above techniques you use, if any, are up to you and + your intended application. Some time/space profiling is + indicated if it really matters (don't just guess). And, if you + manage to do anything along the lines of the third category, the + author would love to hear from you... +
+ Also note that the implementation of bitset used in libstdc++ has + some extensions. +
+
+ Bitmasks do not take char* nor const char* arguments in their + constructors. This is something of an accident, but you can read + about the problem: follow the library's âLinksâ from + the homepage, and from the C++ information âdefect + reflectorâ link, select the library issues list. Issue + number 116 describes the problem. +
+ For now you can simply make a temporary string object using the + constructor expression: +
+ std::bitset<5> b ( std::string(â10110â) );
+
+ instead of +
+ std::bitset<5> b ( â10110â ); // invalid
+