相关疑难解决方法(0)

C的隐藏功能

我知道所有C编译器实现背后都有一个标准,所以应该没有隐藏的功能.尽管如此,我确信所有C开发人员都有他们一直使用的隐藏/秘密技巧.

c hidden-features

141
推荐指数
33
解决办法
8万
查看次数

标签地址(MSVC)

我们正在为高级编译语言编写一个字节码,经过一些分析和优化后,很明显当前最大的性能开销是我们用来跳转到字节码情况的switch语句.

我们调查了拉出每个case标签的地址并将其存储在字节码本身的流中,而不是我们通常打开的指令ID.如果我们这样做,我们可以跳过跳转表,并直接跳转到当前正在执行的指令的代码位置.这在GCC中非常有用,但是,MSVC似乎不支持这样的功能.

我们尝试使用内联汇编来获取标签的地址(并跳转到它们),但它可以工作,但是,使用内联汇编会导致MSVC优化器避免使用整个函数.

有没有办法让优化器仍然运行代码?遗憾的是,我们无法将内联汇编提取到另一个函数中,而不是制作标签的函数,因为即使在内联汇编中也无法为另一个函数引用标签.有什么想法或想法吗?非常感谢您的意见,谢谢!

c++ assembly label goto inline-assembly

25
推荐指数
2
解决办法
5643
查看次数

如何将goto标签存储在数组中然后跳转到它们?

我想声明一个"jumplabels"数组.

然后我想跳到这个数组中的"jumplabel".

但我不知道该怎么做.

它应该类似于以下代码:

function()
{
    "gotolabel" s[3];
    s[0] = s0;
    s[1] = s1;
    s[2] = s2;

    s0:
    ....
    goto s[v];

    s1:
    ....
    goto s[v];

    s2:
    ....
    goto s[v];
}
Run Code Online (Sandbox Code Playgroud)

有谁知道如何执行此操作?

c c++ goto jump-table

18
推荐指数
6
解决办法
9799
查看次数

获取x86的当前指令的地址

我使用Linux与x86(准确地说是64位).有没有办法可以得到当前指令的地址.其实我想写自己的简化版本的setjmp/longjmp.在这里,R ..发布了longjmp的简化版本.知道如何实现setjmp.一个简化的版本,没有考虑异常和信号等...

c linux 64-bit x86 assembly

11
推荐指数
3
解决办法
2万
查看次数

动态跳转到C中的标签

我想显示输出 - 数字1到5,然后是无限的4-5.有什么方法可以传递i(4)的值而不是goto1中的字符i.或者是否有任何其他有效的方法来实现这一点,而没有说明开关中的所有选项(即案例1:goto1(c1)等...).

主要目的是跳转到在程序中计算其标签的语句.

#define goto1(i) \
goto c##i

int main(){    
    c1 : printf(" num is 1 \n");
    c2 : printf(" num is 2 \n");
    c3 : printf(" num is 3 \n");
    c4 : printf(" num is 4 \n");
    c5 : printf(" num is 5 \n");

    int i=4;
    goto1(i);
}
Run Code Online (Sandbox Code Playgroud)

c

6
推荐指数
2
解决办法
3556
查看次数

标签 统计

c ×4

assembly ×2

c++ ×2

goto ×2

64-bit ×1

hidden-features ×1

inline-assembly ×1

jump-table ×1

label ×1

linux ×1

x86 ×1