说我有这个功能:
int func2() {
printf("func2\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我声明一个指针:
int (*fp)(double);
Run Code Online (Sandbox Code Playgroud)
这应该指向一个接受double参数并返回一个的函数int.
func2 没有任何争论,但是当我写作时:
fp = func2;
fp(2);
Run Code Online (Sandbox Code Playgroud)
(2只是一个任意数字),func2`被正确调用.
这是为什么?我为函数指针声明的参数数量没有意义吗?
基本上我试图在C中模拟汇编代码.
这是C代码:
int main()
{
test();
main_next:
printf("Hello, World!");
}
void test()
{
goto main_next;
}
Run Code Online (Sandbox Code Playgroud)
尝试编译此代码(Linux 32位,gcc 4.6.3),我收到此错误:
error: label ‘main_randomtag_next’ used but not defined
Run Code Online (Sandbox Code Playgroud)
有谁知道如何在C中进行这种程序间的转换?
谢谢!
有不同的调用约定在C/C++提供:stdcall,extern,pascal,等有多少这样的调用约定是可用的,什么分别意味着?有没有描述这些的链接?
为什么要在C++函数中最后添加默认参数?
当我使用DotNet1.1时,我遇到了C#的这个问题
问题是这个.我有一个非托管的DLL,它有一个函数,它接受一个函数指针(以及其他参数).当我在C#代码中声明DLLImport时,我传递了一个委托.但是C#中的委托具有stdcall调用约定,而非托管函数需要cdecl函数指针.因此,我天真的做法导致了崩溃.然后我找到了以下内容:http://www.codeproject.com/KB/cs/cdeclcallback.aspx有些人编写了一个优秀的库,可以根据我的理解改变代理的调用约定,MSIL-hacking.事情进展顺利,直到......
我迁移到VS2008和新版本的.NET.在此版本下,上述库不起作用.我不是真正的C#或.NET专家,说实话,我几乎不了解他的库做了什么(虽然它是开源的),所以我甚至不想尝试将它适应新的.NET.但是,我希望更新版本的C#可以为我的问题提供更好的解决方案.
那么,SO专家,请帮我解决臀部疼痛:)
考虑以下代码:
#include <utility>
#include <tuple>
std::pair<int, int> f1()
{
return std::make_pair(0x111, 0x222);
}
std::tuple<int, int> f2()
{
return std::make_tuple(0x111, 0x222);
}
Run Code Online (Sandbox Code Playgroud)
Clang 3和4在x86-64上生成类似的代码:
f1():
movabs rax,0x22200000111
ret
f2():
movabs rax,0x11100000222 ; opposite packing order, not important
ret
Run Code Online (Sandbox Code Playgroud)
但是Clang 5生成了不同的代码f2():
f2():
movabs rax,0x11100000222
mov QWORD PTR [rdi],rax
mov rax,rdi
ret
Run Code Online (Sandbox Code Playgroud)
正如GCC 4至GCC 7一样:
f2():
movabs rdx,0x11100000222
mov rax,rdi
mov QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
ret
Run Code Online (Sandbox Code Playgroud)
返回std::tuple适合单个寄存器的生成代码为什么会更糟std::pair?看起来特别奇怪,因为Clang 3和4似乎是最优的,而5则不是.
在这里试试:https: …
我知道Scala支持来自ALGOL的call-by-name,我想我明白这意味着什么,但Scala可以像C#,VB.NET和C++那样通过引用进行调用吗?我知道Java不能通过引用进行调用,但我不确定这种限制是否仅仅是由于语言还是JVM.
当您想要将大量数据结构传递给方法但是您不想复制它时,这将非常有用.在这种情况下,按引用调用似乎是完美的.
来自维基百科:
在计算中,红色区域是函数堆栈帧中超出返回地址的固定大小区域,该区域不被该函数保留.被调用函数可以使用红色区域来存储局部变量,而无需修改堆栈指针的额外开销.中断/异常/信号处理程序不会修改此内存区域.System V使用的x86-64 ABI要求一个128字节的红色区域,它直接在返回地址之后开始并包含函数的参数.OpenRISC工具链假设一个128字节的红色区域.
超出%rsp指向的位置的128字节区域被认为是保留的,不应被信号或中断处理程序修改.因此,函数可以将此区域用于函数调用不需要的临时数据.特别是,叶子函数可以将这个区域用于它们的整个堆栈帧,而不是调整序言和尾声中的堆栈指针.这个区域被称为红区.
鉴于这两个引号,堆叠的返回地址上方或堆叠的返回地址下方的红色区域 是?
由于这个红色区域是相对的RSP,它是否向下push移动并且每个区域向上移动pop?
AMD64 psABI过去曾在x86-64.org上托管.
我有一份pdf文件,它明确地说:
该体系结构规范可在网站 http://www.x86-64.org/documentation上获得.
但是http://www.x86-64.org已经很长时间了.至少几个月.
有谁知道最新的psABI可以从哪里拿走?