小编Bon*_*ero的帖子

类/结构成员的地址排序

C++23 草案要求结构或类的后续非静态数据成员必须具有更高的地址。据我所知,早期的标准也部分地要求这样做,但是当允许编译器重新排序这些数据成员时有一些规则。这里有人能告诉我哪些规则在什么时候适用吗?

c++ language-lawyer c++23

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

使用模板参数列表调用 lambda,不提供参数

谁能告诉我这是否...

#include <memory>

using namespace std;

int main()
{
    auto f = []<typename T>() -> T
    {
        return 123;
    };
    f.operator ()<int>();
}
Run Code Online (Sandbox Code Playgroud)

... 是不带参数调用 C++20 泛型 lambda 的唯一方法吗?

c++ templates c++20

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

缓存集大小不是 2 的幂

我有一台配备 Ryzen 7 1800X CPU 的 Linux 计算机。根据 WikiChip 的说法,它的 L2-DTLB 有 1536 个条目。所以我假设关联性可以被 3 整除。我编写了一个小程序来检查 CPUID 报告的关联性。有趣的是,它给了我 8 的关联性。为什么呢?这将给出 192 个条目的集合大小,因此没有简单的模 2 次幂索引。那么该指数是如何有效计算的呢?

那是我的程序:

#include <iostream>
#if defined(_MSC_VER)
    #include <intrin.h>
#elif defined(__GNUC__)
    #include <cpuid.h>
#endif

using namespace std;

unsigned cpuid( unsigned (&cpuidRegs)[4], unsigned code, unsigned ex );

int main()
{
    static unsigned const SHORT_WAYS[0x10] = { 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, (unsigned)-1 };
    unsigned regs[4];
    cpuid( regs, 0x80000006u, 0 …
Run Code Online (Sandbox Code Playgroud)

x86 cpu-architecture tlb cpuid amd-processor

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

使用 x86 寻找_一个字节_无效的操作码

我需要一个 x86(不是 x64!)的无效操作码,其长度恰好是一个字节,以覆盖外部进程中的某些代码。目前我正在使用 INT3 (0xCC),但最好单独捕获无效操作码,因为外部进程包含大量有效的 INT3。

x86 assembly exception

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

使用 FFMPEG 从 MKV 中删除字幕

任何人都可以告诉我一种从带有 FFMPEG 的 MKV 中删除除多种指定语言之外的所有子图块的方法吗?最好是可以从多个文件中按顺序完成此操作?

ffmpeg mkv

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

CVTTSD2SI - 截断指令 - 使用具有“不精确”结果的舍入?

根据 Intel 文档CVTTSD2SI,如果转换不精确,则将 fp 值截断为 64 位有符号整数的指令将根据 MXCSR 舍入模式进行舍入。

但简单的截断转换怎么会不精确呢?我认为要么该值符合整数范围,要么不符合整数范围;如果不是,则不进行舍入,但值为 -1 << 63,并且可能会引发异常。

以下是英特尔文档的内容:

当转换不精确时,返回的值将根据 MXCSR 寄存器中的舍入控制位进行舍入。

x86 assembly sse floating-point-conversion

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

结果为 0 但不会破坏依赖性的指令

我开发了一个小基准。该基准测试中循环的结果应转换为零,并且下一轮计算应取决于之前循环的零“结果”来测量代码的延迟而不是其吞吐量。将结果移至另一个寄存器并对其本身进行异或运算是行不通的,因为当今的 CPU 认识到与其自身进行异或运算并不依赖于之前的指令。所以我尝试从寄存器本身中减去寄存器,希望CPU(Ryzen Threadripper 3990X)没有像XOR这样的快捷方式。我用一个单独的程序对此进行了评估:

#include <iostream>
#include <chrono>

using namespace std;
using namespace chrono;

int main()
{
    auto start = high_resolution_clock::now();
    for( size_t i = 1'000'000'000; i--; )
        __asm
        {
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
            sub     eax, eax
        }
    double ns = (int64_t)duration_cast<nanoseconds>( high_resolution_clock::now() - start ).count() / 10'000'000'000.0;
    cout << ns << endl;
}
Run Code Online (Sandbox Code Playgroud)

“不幸的是”CPU在这里也做了一个捷径,每条指令大约需要0.06ns,即。CPU 在每个时钟周期 …

x86 assembly cpu-architecture microbenchmark

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

有没有办法从集合中删除并将值移动到临时值?

有没有办法删除集合/映射中的项目并获取前一个值作为临时返回值,以便我可以 move() 到其他地方?

c++ std c++11

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

为什么 AMD Zen 上较大值的整数除法吞吐量差异很小?

我很好奇将两个值除以不同数量的值位但操作数(寄存器)位不变时的性能差异。我预计性能取决于被除数的最高设置位,因为我假设 CPU 内部的迭代减法和移位“算法”可能在一个时钟周期内进行多次迭代。

所以我写了一个 C++20 程序来测试这个:

#include <iostream>
#include <iostream>
#include <type_traits>
#include <cstdint>
#include <random>
#include <limits>
#include <atomic>
#include <chrono>
#include <vector>
#include <sstream>

using namespace std;
using namespace chrono;

int main()
{
    constexpr size_t ROUNDS = 100'000'000;
    auto ssp = []<typename TOp, typename TValue>() -> double
        requires is_unsigned_v<TOp> && is_unsigned_v<TValue> && (sizeof(TOp) >= sizeof(TValue))
    {
        constexpr size_t N = 0x1000;
        vector<TOp> vDividends( N ), vDivisors( N );
        mt19937_64 mt;
        uniform_int_distribution<unsigned> uidBits( 0, sizeof(TValue) * CHAR_BIT - 1 …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly cpu-architecture integer-division

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

可变参数概念约束

不幸的是这段代码不起作用:

#include <iostream>
#include <type_traits>
#include <utility>
#include <tuple>

template<typename FirstArg, typename ... Args>
    requires (sizeof ... (Args) == 0 || (std::is_convertible_v<Args ..., FirstArg>))
constexpr void multi_max( FirstArg firstArg, Args const &... args )
{
    using namespace std;
    FirstArg &max = firstArg;
    auto findMax = [&]<size_t ... Is>( index_sequence<Is ...> iseq, tuple<Args ...> tArgs )
    {
        ((max = get<Is>( tArgs ) > max ? get<Is>( tArgs ) : max), ...);
    };
    findMax( make_index_sequence<sizeof ... (Args)>(), make_tuple( args ... ) ); …
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

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