小编Bon*_*ero的帖子

具有函数本地类型的std :: vector <T>

为什么这样呢

#include <vector>

void f()
{
    struct S
    {
        int first, second, third;
    };

    std::vector<S> vs;
}
Run Code Online (Sandbox Code Playgroud)

使用Visual C++ 2015,但不是使用g ++ 4.8.4?

c++

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

如何使用 Concept 检查函数是否具有准确的返回类型?

有一个std::convertible_to<T>概念是检查调用结果是否可以转换为某种类型。

但我想检查函数是否具有确切的返回类型。我怎样才能做到这一点?

c++ function return-type c++-concepts c++20

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

使用 x86 计算 32 位相对跳转偏移量

我想修改 32 位 DLL 的入口点。我已经尝试用...覆盖入口点

mov     eax, OFFSET absolute_immediate
jmp     eax
Run Code Online (Sandbox Code Playgroud)

...在此钩子模式中编码。

// mov eax, addr; jmp eax
static uchar_t hookPattern[] = { 0xB8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xE0 };
Run Code Online (Sandbox Code Playgroud)

该代码工作正常,但我想要一个相对跳转。
我尝试了这个钩子模式:

static uchar_t hookPattern[] = { 0xE9, 0x00, 0x00, 0x00, 0x00 }; // jmp REL32
Run Code Online (Sandbox Code Playgroud)

并像这样覆盖四个相对字节:

DWORD dwModify = (char *)&::myHook - (char *)entryPoint;
memcpy( hookPattern + 1, &dwModify, sizeof dwModify );
Run Code Online (Sandbox Code Playgroud)

但是如果我调用entryPoint,我会意外地重定向到运行时的一个完全不同的函数,但不会重定向到myHook。
我在计算相对偏移量时遗漏了一些东西吗?

x86 assembly

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

为什么 AMD-CPU 有如此愚蠢的暂停计时

我开发了一个类似于 Java for C++ 的监视器对象,并进行了一些改进。主要的改进是不仅有一个用于锁定和解锁的自旋循环,而且还有一个用于等待事件的自旋循环。在这种情况下,您不必锁定互斥体,而是在 wait_poll 函数上提供谓词,并且代码反复尝试锁定互斥体轮询,如果它可以锁定互斥体,则它会调用返回(或移动)一对的谓词bool 和结果类型。

即使调用立即返回,等待内核中的信号量和/或事件对象 (Win32) 也很容易花费 1.000 到 10.000 个时钟周期,因为之前已经设置了信号量或事件。因此,必须有一个与该等待间隔具有合理关系的旋转计数,其中旋转的时间是内核中所花费的最小间隔的十分之一。

通过我的监控对象,我从 glibc 中获取了自旋计数重新计算算法。我还使用暂停指令。但我发现在我的CPU(TR 3900X)上暂停指令太快了。平均约为 0.78ns。在 Intel-CPU 上,它更合理,约为 30 纳秒。

这是代码:

#include <iostream>
#include <chrono>
#include <cstddef>
#include <cstdint>
#include <immintrin.h>

using namespace std;
using namespace chrono;

int main( int argc, char **argv )
{
    static uint64_t const PAUSE_ROUNDS = 1'000'000'000;
    auto start = high_resolution_clock::now();
    for( uint64_t i = PAUSE_ROUNDS; i; --i )
        _mm_pause();
    double ns = (int64_t)duration_cast<nanoseconds>( high_resolution_clock::now() - start ).count() / (double)PAUSE_ROUNDS;
    cout << …
Run Code Online (Sandbox Code Playgroud)

x86 assembly spinlock spinwait amd-processor

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

是否可以使用 C++20 重载类?

是否可以使用 C++20 重载带有概念的类?我刚刚尝试过这个,但它不起作用。

template<typename StringT>
    requires requires( StringT t )
    {
        { t } -> same_as<string>;
    }
struct S
{
};

template<typename StringT>
    requires requires( StringT t )
    {
        { t } -> same_as<wstring>;
    }
struct S
{
};
Run Code Online (Sandbox Code Playgroud)

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

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

字符串或字符串视图的比较是否以空字符终止?

是否可以包含astring或字符,以便以下代码打印 1 两次?string_view'\0'

或者这只是实现定义的?

#include <iostream>
#include <string_view>
#include <string>

using namespace std;

int main()
{
    string_view sv( "\0hello world", 12 );
    cout << (sv == sv) << endl;
    string str( sv );
    cout << (str == sv) << endl;
}
Run Code Online (Sandbox Code Playgroud)

这与字符串是否可以嵌入空值的问题并不重复,因为它们显然可以我想问的是字符串或字符串视图的比较是否以 0 字符终止。

c++ c++17

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

如何检查有符号的返回类型?

想象一下我有一个可调用的模板参数“Fn fn”。现在我想检查它的返回类型是否是有符号标量。我如何使用 C++20 概念做到这一点?

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

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

1.0 / 0.0 - 有效的声明?

我只是想对 std::set<> 应用无穷大的加载因子,因为我想要有固定数量的存储桶。所以我使用了 1.0f / 0.0f 的负载因子,因为它比 numeric_limits<float>::infinity() 更短。MSVC 由于被零除而给出错误。clang-cl 和 clang++ 编译代码没有错误。那么哪个编译器是正确的呢?

c++ ieee-754

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