为了了解std::vector<int>我写的内存消耗:
std::cout << sizeof(std::vector<int>) << std::endl;
Run Code Online (Sandbox Code Playgroud)
这产生32. 我试图理解这个价值从何而来。有些人查看了std::vector存储指针的源代码_MyFirst,_MyLast并_MyEnd解释了 24 字节的内存消耗(在我的 64 位系统上)。
最后一个字节怎么样8?据我了解,存储的分配器不使用任何内存。另外,这可能是实现定义的(是吗?),所以这可能有帮助:我正在使用 MSVC 2017.5。我不保证通过查看代码找到所有成员;该代码对我来说看起来非常混乱。
一切似乎都很好地对齐,但答案可能如下?:为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?。但我用一个简单的测试它struct Test { int *a, *b, *c; };满足sizeof(Test) == 24.
一些背景
在我的程序中,我将有很多向量,但似乎其中大部分都是空的。这意味着关键的内存消耗来自空状态,即堆分配的内存不是那么重要。
一个简单的“仅用于此用例”向量很快就实现了,所以我想知道我是否遗漏了任何东西,无论如何我都需要 32 字节的内存,即使使用我自己的实现(注意:我很可能不会实现我自己的,这只是好奇心)。
更新
我用以下结构再次测试了它:
struct Test
{
int *a, *b, *c;
std::allocator<int> alloc;
};
Run Code Online (Sandbox Code Playgroud)
现在给了sizeof(Test) == 32。看起来,即使std::allocator没有消耗内存的成员(我认为),它的存在也会将Test …
我想测试子弹物理的春季约束。因此,我创建了一个悬停在地面上方的静态框,并将第二个动态框悬于其下。但是激活弹簧行为无济于事!盒子确实可以自由悬挂。我知道是因为它可以自由旋转。但它不会振荡或发生任何变化。
btCollisionShape *boxShape = createBoxShape(0.2f, 0.2f, 0.2f);
btRigidBody *box1 = createStatic(boxShape);
btRigidBody *box2 = createDynamic(1.0f /*mass*/, boxShape);
box1->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 2.0f, 1.0f }));
box2->setWorldTransform(btTransform(btQuaternion::getIdentity(), { 0.0f, 1.0f, 1.0f }));
btGeneric6DofSpring2Constraint *spring = new btGeneric6DofSpring2Constraint(
*box1, *box2,
btTransform(btQuaternion::getIdentity(), { 0.0f, -1.0f, 0.0f }),
btTransform(btQuaternion::getIdentity(), { 0.0f, 0.0f, 0.0f })
);
// I thought maybe the linear movement is locked, but even using these lines do not help.
// spring->setLinearUpperLimit(btVector3(0.0f, 0.1, 0.0f));
// spring->setLinearLowerLimit(btVector3(0.0f, -0.1, 0.0f));
// Enabling the spring …Run Code Online (Sandbox Code Playgroud) 从 C++20 开始,标准库使用spaceship 运算符来实现字符串和向量的比较(根据此视频)。我担心这会带来潜在的巨大性能损失!
让我对运营商的例子解释!=为string:
str1 != str2,编译器现在将其转换为(str1 <=> str2) != 0.!=for的有效实现string将首先检查 for str1.size() != str2.size(),并且只有在失败时才转移到比较实际字符。因此,如果这真的是现在比较字符串的不等式,这不是一个巨大的性能损失吗?
c++ ×3
bullet ×1
c++20 ×1
comparison ×1
performance ×1
sizeof ×1
stdvector ×1
stl ×1
vector ×1