小编rtp*_*pax的帖子

每个c ++成员函数是否隐含地将"this"作为输入?

当我们在c ++中为类创建一个成员函数时,它有一个隐式的额外参数,它是一个指向调用对象的指针 - 被称为this.

对于任何函数都是如此,即使它不使用this指针也是如此.例如,给定班级

class foo
{
private:
    int bar;
public:
    int get_one()
    {
      return 1;  // Not using `this`
    }
    int get_bar()
    {
        return this->bar;  // Using `this`
    }
}
Run Code Online (Sandbox Code Playgroud)

两个函数(get_oneget_bar)都将this作为隐式参数,即使其中只有一个实际使用它吗?
这样做似乎有点浪费.

注意:我理解正确的做法是做get_one()静态,答案可能取决于实现,但我只是好奇.

c++ performance this member-functions language-lawyer

22
推荐指数
2
解决办法
1268
查看次数

函数调用循环比空循环快

我将一些程序集与一些c链接起来测试函数调用的成本,使用以下程序集和c源代码(分别使用fasm和gcc)

部件:

format ELF

public no_call as "_no_call"
public normal_call as "_normal_call"

section '.text' executable

iter equ 100000000

no_call:
    mov ecx, iter
@@:
    push ecx
    pop ecx
    dec ecx
    cmp ecx, 0
    jne @b
    ret

normal_function:
    ret

normal_call:
    mov ecx, iter
@@:
    push ecx
    call normal_function
    pop ecx
    dec ecx
    cmp ecx, 0
    jne @b
    ret
Run Code Online (Sandbox Code Playgroud)

c来源:

#include <stdio.h>
#include <time.h>

extern int no_call();
extern int normal_call();

int main()
{
    clock_t ct1, ct2;

    ct1 = clock();
    no_call();
    ct2 = clock(); …
Run Code Online (Sandbox Code Playgroud)

c performance x86 assembly fasm

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

有没有办法让函数返回一个typename?

我最近正在开展一个项目,并希望在执行标准以外的操作时优先考虑某些类型.为此,我试图以某种方式使用模板来确定正在使用的数据类型.我写的清楚的代码不起作用,但它可以了解我正在尝试做的事情

#include <iostream>

template <type1,type2>
typename determine(type1 a, type2 b)
{
    if (typeid(type1) == typeid(int) || typeid(type2) == typeid(int))
        return int;
    else return double;
}

int main()
{
    int a = 3;
    double b = 2;
    std::cout << (static_cast<determine(a, b)>(a) / static_cast<determine(a, b)>(b)) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确定返回我实际可以用来决定使用什么数据类型的东西?

c++ templates types

7
推荐指数
2
解决办法
4213
查看次数

如何在 _Pragma 的参数中连接字符串

_Pragma 的参数是一个字符串,所以我认为当您以正常的 c 预处理器方式将字符串粘贴在一起(即,将它们彼此相邻)时,您可以为 _Pragma 的参数形成一个新字符串。然而

_Pragma("GCC Poison " "puts")
Run Code Online (Sandbox Code Playgroud)

因错误而失败

error: _Pragma takes a parenthesized string literal
Run Code Online (Sandbox Code Playgroud)

如何规避?

这个特殊的例子不是很有用,并且有一个简单的解决方案,让它们一开始都是一个字符串,但最终目标是将一个宏字符串化到其中

c gcc pragma c-preprocessor

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

为什么我不能重定向 WriteConsole 的输出?

在下面的程序中,我使用两个不同的函数打印到控制台

#include <windows.h>

int main() {
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD byteswritten;
    WriteConsole(h, "WriteConsole", 12, &byteswritten, NULL);
    WriteFile(h, "WriteFile", 9, &byteswritten, NULL);
}
Run Code Online (Sandbox Code Playgroud)

如果当我执行这个程序并重定向它的输出使用a > out.txtora 1> out.txt什么都没有打印到控制台(如预期的那样)但内容out.txt只是

WriteFile
Run Code Online (Sandbox Code Playgroud)

允许将调用WriteFile重定向到文件和调用WriteConsole转到...无处的两者之间有什么不同

在 Windows 10 上用 gcc 和 msvc 测试

c console winapi windows-console

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

指示在c中评估操作数的顺序

声明puts("a") + puts("b")未定义.这是因为C标准中没有规定这些是否应该从左到右或从右到左执行,这样你才能得到

a
b
Run Code Online (Sandbox Code Playgroud)

要么

b
a
Run Code Online (Sandbox Code Playgroud)

是否有一种干净的方式来决定表达式中的操作顺序?

我唯一能想到的是使用复合语句,如

({
    int temp = puts("a");
    temp += puts("b");
    temp;
})
Run Code Online (Sandbox Code Playgroud)

虽然这是不便携的,比我希望的要长一点.

如何最好地实现这一目标?

c operator-precedence

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

在c ++ 17中是否存在stl容器的三向比较

是否有标准函数允许stl容器的三路比较

例如

cmp({1,2},{1,3}) < 0
cmp({1,2},{1,2}) == 0
Run Code Online (Sandbox Code Playgroud)

我想避免在一些可能的大型容器上进行两次比较,如果有标准的话,我宁愿使用标准功能而不是自己滚动.我没有在stl容器的cppreference页面上看到任何内容,但我希望有一些东西.

c++ comparison c++17

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