我正在尝试在不同的编译器上自己试验代码。我一直在尝试查找在某些函数上禁用异常的优势(通过二进制足迹)并将其与不禁用异常的函数进行比较,实际上我偶然发现了一个奇怪的情况,其中最好有异常比没有。
我一直在使用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) 我正在我的 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) 在过去,我一直在使用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++ ×3
c++-chrono ×1
c++17 ×1
char-pointer ×1
clang ×1
gameboy ×1
noexcept ×1
optimization ×1
performance ×1
timing ×1