VS2013下解决C++编译期初始化2^16位std::bitset的字符串超限问题
大位宽固定常量std::bitset的编译期初始化经验
需求说明
我需要存储一个静态常量、长度为2¹⁶位的std::bitset,内部存放的0/1位序列完全固定,运行过程中不会修改。
初次尝试踩坑
我最初采用传入字符串字面量的编译期初始化方案,代码写法如下:
std::bitset<1<<16> myBitset("101100101000110 ... "); // 省略号位置替换为实际的65536位序列
但在VS2013编译器下,直接抛出了字符串过长的编译错误。
拆分字符串的二次尝试
我尝试把过长的字符串拆成多段短字符串,借助C++相邻字符串字面量自动拼接的特性改写代码:
std::bitset<1<<16> myBitset("100101 ..." "011001 ..." ... );
但编译仍然报错,错误码为C1091:编译器限制:字符串长度超过65535字节。我算了下实际长度:手里的完整位串共65536字节,加上字符串末尾的EOS结束符,总长度是65537字节,刚好超出了该版本编译器的字符串字面量长度上限。
针对这个问题,想请教还有哪些可行的实现方案?
最终落地的实现
感谢用户luk32给出的移位按位或思路,我最终采用这种方式完成了初始化,写法可正常通过VS2013编译:
const std::bitset<1<<16> bs = (std::bitset<1<<16>("101011...") << 7* (1<<13)) | (std::bitset<1<<16>("110011...") << 6* (1<<13)) | (std::bitset<1<<16>("101111...") << 5* (1<<13)) | (std::bitset<1<<16>("110110...") << 4* (1<<13)) | (std::bitset<1<<16>("011011...") << 3* (1<<13)) | (std::bitset<1<<16>("111011...") << 2* (1<<13)) | (std::bitset<1<<16>("111001...") << 1* (1<<13)) | std::bitset<1<<16>("1100111...");
内容的提问来源于stack exchange,提问作者Richard Pickle
相关产品推荐
相关产品推荐

