小编xxh*_*hxx的帖子

为什么 __int128_t 在 x86-64 GCC 上比 long long 快?

这是我的测试代码:

#include <chrono>
#include <iostream>
#include <cstdlib>
using namespace std;

using ll = long long;

int main()
{
    __int128_t a, b;
    ll x, y;

    a = rand() + 10000000;
    b = rand() % 50000;
    auto t0 = chrono::steady_clock::now();
    for (int i = 0; i < 100000000; i++)
    {
        a += b;
        a /= b;
        b *= a;
        b -= a;
        a %= b;
    }
    cout << chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - t0).count() << ' '
         << (ll)a % 100000 << '\n';

    x = …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86-64 cpu-architecture integer-division

43
推荐指数
2
解决办法
3808
查看次数

为什么这个 std::launder 示例是未定义的行为?

这是我不明白的示例部分:

struct Y
{
    int z;
};
int main()
{
    alignas(Y) std::byte s[sizeof(Y)];
    Y *q = new (&s) Y{2};
    const int f = reinterpret_cast<Y *>(&s)->z; // Class member access is undefined behavior:
                                                // reinterpret_cast<Y*>(&s) has value "pointer to s"
                                                // and does not point to a Y object
}
Run Code Online (Sandbox Code Playgroud)

整个示例位于https://en.cppreference.com/w/cpp/utility/launder

我不明白为什么使用reinterpret_cast<Y *>(&s)->z是未定义的行为。我们已经在所谓的“指向s的指针”处构造了一个Y对象,也将其重新解释为Y*,那为什么还说“它不指向一个Y对象”呢?

c++

8
推荐指数
1
解决办法
186
查看次数

c++ - 为什么在C ++中进行移位操作后,位字段的无符号整数会变成有符号整数?

测试代码:

struct A
{
    uint32_t lo : 16;
    uint32_t hi : 16;
};

int main()
{
    A a{};
    a.lo = 0xFFFF;
    auto b = a.lo << 16;
    cout << b << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:-65536,类型bint但不是uint32_t

我发现,uint16_t并且uint8_t在移位运算符之后也会变成有符号整数,并且在 中有一个类似的问题C#,得出的结论是当操作数<32位时结果会变成有符号。 为什么当操作数小于 32 位时,移位操作总是产生有符号整数

但是 的类型a.lo是明确的uint32_t,可以通过 验证decltype(a.lo),那么这怎么解释呢?

c++ language-lawyer

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

在 C++ 中,如何使同一个基类派生两次?

假设有一个类A

我希望我的类从两次派生A,以便管理两个A段并访问它们的受保护方法。

喜欢:

typedef A yetA;

class D: public A, public yetA {};
Run Code Online (Sandbox Code Playgroud)

这是行不通的。有没有办法做到这一点?

c++

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

在C++中,如果文件不存在,如何安全地创建文件,但如果存在则不打开它?

如果我直接使用ios::out打开一个文件,那么如果该文件存在,它将覆盖它或修改它。

但如果我用 来检查是否存在名为“XXX”的文件ios::in,如果不存在则用 来创建ios::out,则在此期间文件“XXX”可能被其他程序创建,那么文件“XXX”将被覆盖或被删除。和第一种情况一样修改。

如何fstream在 C++ 中安全地创建文件?

c++ visual-c++ c++11

0
推荐指数
1
解决办法
1541
查看次数