在某些情况下,请参见下面一个例子,std::is_floating_point在返回false的float.
#include <iostream>
#include <type_traits>
#include <vector>
int main()
{
::std::cout << typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])).name() << ::std::endl;
if (::std::is_floating_point< decltype(::std::vector< float >()[::std::vector< float >().size()]) >::value)
{
::std::cout << "floating point" << ::std::endl;
}
else
{
::std::cout << "not floating point" << ::std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
GCC的输出
f
not floating point
Run Code Online (Sandbox Code Playgroud)
在这个例子中,人们可以看到它typeid被::std::vector< float >()[::std::vector< float >().size()]视为a float,它返回正确的名称.人们也可以检查typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])) == typeid(flat)退货true.但是, …
我正在处理C++中非常大的布尔列表,每个约有2 ^ N个N布尔项.因为内存在这种情况下是关键的,即指数增长,我想构建一个N位长变量来存储每个元素.
对于小N,例如24,我只是使用unsigned long int.需要64MB((2 ^ 24)*32/8/1024/1024).但我需要上升到36.内置的变量是唯一的选择unsigned long long int,但它需要512GB((2 ^ 36)*64/8 /一千○二十四分之一千○二十四/ 1024),这是一个有点过分.使用36位变量,它可以为我工作,因为大小下降到288GB((2 ^ 36)*36/8/1024/1024/1024),这适合我的超级计算机的节点.
我试过std::bitset,但std::bitset< N >创造了至少8B的元素.所以列表std::bitset< 1 >远远大于列表unsigned long int.这是因为std::bitset只是改变了表示,而不是容器.
我也尝试过boost::dynamic_bitset<>Boost,但结果甚至最差(至少32B!),出于同样的原因.
我知道一个选项是将所有元素写为一个布尔链,2473901162496(2 ^ 36*36),然后存储在38654705664(2473901162496/64)unsigned long long int,它给出288GB(38654705664*64/8/1024/1024/1024).然后访问元素只是找到存储36位的元素的游戏(可以是一个或两个).但是现有代码(3000行)的重写很多,因为映射变得不可能,并且因为在某些功能执行期间添加和删除项目肯定会复杂,混乱,具有挑战性,结果很可能效率不高.
如何在C++中构建一个N位变量?
让我们考虑一个bar在命名空间foo中声明的函数,它返回一个std::vector< float >(但也适用于其他对象).
// header.h
#include <vector>
namespace foo
{
::std::vector< float > bar();
}
Run Code Online (Sandbox Code Playgroud)
使用相对命名空间编译其定义.
#include "header.h"
::std::vector< float > foo::bar()
{
}
Run Code Online (Sandbox Code Playgroud)
但是,使用绝对命名空间编译其定义不起作用.
#include "header.h"
::std::vector< float > ::foo::bar()
{
}
Run Code Online (Sandbox Code Playgroud)
GCC的返回错误是
function.cpp:3:26: error: ‘foo’ in ‘class std::vector<float>’ does not name a type
::std::vector< float > ::foo::bar()
Run Code Online (Sandbox Code Playgroud)
事实证明,在命名空间中允许使用空格,因此,::std::vector< float > ::foo::bar()相当于::std::vector< float >::foo::bar().当返回类型是对象时,如何在函数定义中使用绝对命名空间?
c++ ×3
algorithm ×1
bitarray ×1
bitset ×1
declaration ×1
namespaces ×1
object ×1
optimization ×1
return ×1
std ×1
typeid ×1
types ×1