小编Noa*_*rik的帖子

在这种情况下,带有 noexcept 的 C++ 函数实际上更慢?

我正在尝试在不同的编译器上自己试验代码。我一直在尝试查找在某些函数上禁用异常的优势(通过二进制足迹)并将其与不禁用异常的函数进行比较,实际上我偶然发现了一个奇怪的情况,其中最好有异常比没有。

我一直在使用Matt Godbolt 的 Compiler Explorer进行这些检查,并且在 x86-64 clang 12.0.1 上进行了检查,没有任何标志(在 GCC 上这种奇怪的行为不存在)。

看看这个简单的代码:

auto* allocated_int()
{
    return new int{};
}

int main()
{
    delete allocated_int();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

非常简单,几乎删除了从函数返回的已分配指针allocated_int()

正如预期的那样,二进制占用空间也很小:

allocated_int():                     # @allocated_int()
        push    rbp
        mov     rbp, rsp
        mov     edi, 4
        call    operator new(unsigned long)
        mov     rcx, rax
        mov     rax, rcx
        mov     dword ptr [rcx], 0
        pop     rbp
        ret
Run Code Online (Sandbox Code Playgroud)

此外,非常直接。但是当我将noexcept关键字应用于allocated_int()函数时,二进制膨胀。我将在此处应用生成的程序集:

allocated_int():                     # @allocated_int()
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov …
Run Code Online (Sandbox Code Playgroud)

c++ optimization performance clang noexcept

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

不同计算机上的时钟时序变化

我正在我的 github 上开发 DMG-01(又名 gameboy 1989)的实现。我已经实现了 APU 和 PPU,并且在我的电脑(以及我朋友的电脑)上实现了(几乎)完美的计时。然而,当我在我朋友的一台电脑上运行模拟器时,它的运行速度是我或我其他朋友的两倍

同步时钟(Gameboy 和运行它的电脑之间)的代码如下:

Clock.h 头文件:

class Clock
{
// ...
public:
    void SyncClock();

private:
    /* API::LR35902_HZ_CLOCK is 4'194'304 */
    using lr35902_clock_period = std::chrono::duration<int64_t, std::ratio<1, API::LR35902_HZ_CLOCK>>;
    static constexpr lr35902_clock_period one_clock_period{1};
    using clock = std::chrono::high_resolution_clock;

private:
    decltype(clock::now()) _last_tick{std::chrono::time_point_cast<clock::duration>(clock::now() + one_clock_period)};
};
Run Code Online (Sandbox Code Playgroud)

时钟.cpp文件

void Clock::SyncClock()
{
    // Sleep until one tick has passed.
    std::this_thread::sleep_until(this->_last_tick);

    // Use time_point_cast to convert (via truncation towards zero) back to
    // the "native" duration of high_resolution_clock
    this->_last_tick = std::chrono::time_point_cast<clock::duration>(this->_last_tick …
Run Code Online (Sandbox Code Playgroud)

c++ timing gameboy c++-chrono c++17

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

c/c ++中指向char数组的指针

在过去,我一直在使用Visual Studio 2010/2013/2015,这种语法是可行的:

char* szString = "This works!";
Run Code Online (Sandbox Code Playgroud)

我决定继续并改变我对Linux的编码生活方式,因为我安装了g ++并将SlickEdit作为我的IDE.

似乎这句话不再适用了.任何人都可以说明原因吗?

但这有效:

char strString[] = "This works!";
Run Code Online (Sandbox Code Playgroud)

这个错误与c ++ 11有关.

有谁知道为什么会这样?不是如何修复它,导致在我的工作区中没有任何方法来安装c ++ 11编译器,我只是好奇它是否与后台有关编译器工作方式的内容有关.我对第一行代码的了解是,它在堆栈上创建一个常量变量,并创建一个新的指针设置自己朝向ESP的值,但在第二行,它计算常量变量上的字母数量然后最后设置一个null终止符作为结果.

哦,还有一件事 - >第一个在GCC/GPP中设置的方式似乎也有区别,因为第一个类型是{char*&},第二个类型是{char(*)[12]对此也有任何解释?谢谢!

c++ char-pointer

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