小编M. *_*ter的帖子

如何解释 sizeof(std::vector<int>) 的值?

为了了解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 …

c++ stl vector sizeof stdvector

5
推荐指数
1
解决办法
1309
查看次数

如何使用Bullet Physics进行弹簧约束?

我想测试子弹物理的春季约束。因此,我创建了一个悬停在地面上方的静态框,并将第二个动态框悬于其下。但是激活弹簧行为无济于事!盒子确实可以自由悬挂。我知道是因为它可以自由旋转。但它不会振荡或发生任何变化。

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++ bullet bulletphysics physics-engine

3
推荐指数
1
解决办法
1262
查看次数

C++20 飞船操作符的性能问题?

从 C++20 开始,标准库使用spaceship 运算符来实现字符串和向量的比较(根据此视频)。我担心这会带来潜在的巨大性能损失!

让我对运营商的例子解释!=string

  • 当我编写时str1 != str2,编译器现在将其转换为(str1 <=> str2) != 0.
  • 但是,!=for的有效实现string将首先检查 for str1.size() != str2.size(),并且只有在失败时才转移到比较实际字符。
  • 不能为飞船操作员实现这种优化,因为无论如何它必须确定“更大”的字符串。

因此,如果这真的是现在比较字符串的不等式,这不是一个巨大的性能损失吗?

c++ comparison performance spaceship-operator c++20

2
推荐指数
1
解决办法
85
查看次数