我如何强制gcc/g不使用寄存器,而只使用x86\u 64中的堆栈将参数传递给函数,就像在32位版本中一样(并可能以这种方式获取函数结果)。我知道它破坏了官方ABI,调用方和被叫方都必须以这种方式编译,这样它才能工作。我不在乎是否使用推送/弹出或移动/子方式。我希望编译器应该有一个可以强制执行它的标志,但我找不到它。
似乎你不能不入侵GCC的源代码。
没有使用效率低下的堆栈参数的标准x86-64调用约定。
GCC只知道如何使用标准调用约定,在本例中是x86-64 SysV和MS Windows fastcall和vectorcall。(例如\uu attribute\uuu((ms\u abi))
或矢量调用(vectorcall)
)。通常没有人想要这个;MS的调用约定对于包装器或变量函数来说已经足够友好了。即使在为Linux、MacOS、*BSD等编译时,您也可以将其用于某些函数(由属性控制),如果这样有帮助的话。很难想象纯堆栈参数的用例。
GCC允许您将寄存器指定为固定的(GCC从未接触过,例如-ffixed-rdi
)、调用重击的或调用保留的。但是使用带有arg传递寄存器的寄存器只会创建错误的代码,而不是您想要的。
e、 g。
int foo(int a, int b, int c);
void caller(int x) {
foo(1,2,3);
//foo(4,x,6);
}
编译gcc9.2-O3-fcall-保存-rdi
caller:
push rdi
mov edx, 3
mov esi, 2
pop rdi
jmp foo
它保存/恢复RDI,但在调用foo
之前,不会在RDI中放入1。
而且它不会将RDI排除在arg传递序列之外,并在稍后碰撞其他arg。(我在想,您可能能够发明一种调用约定,其中所有通过arg的寄存器都是固定的,或者保存了调用,也许可以让GCC返回堆栈arg。但是没有。)
我希望将clob列的约束更改为约束。但是,当尝试 或 我做错了什么?在这种情况下,我也必须使用临时栏吗?我知道使用temp列将数据类型从clob更改为varchar2的场景,但这里我只想更改约束。为什么这是不可能的? 提前感谢!
问题内容: 尝试更改表时出现此错误。 这是我成功运行的CREATE TABLE STATEMENT。 然后,我尝试执行此语句,但出现了以上错误。 问题答案: 外键字段和引用的类型和定义必须相同。这意味着您的外键不允许更改字段的类型。 一种解决方案是: 现在您可以更改您的person_id 重新创建外键 编辑: 上面添加了锁,感谢评论 在执行此操作时,您必须禁止写入数据库,否则可能会冒数据完整性问题
问题内容: 我已经在已经具有gcc / g -4.4的ubuntu 11.04上安装了gcc-3.3 / g -3.3。所以在我的系统中gcc-3.3和4.4都可用。我可以根据需要调用两个编译器。如果我只是调用命令,那么将调用gcc-4.4。要调用gcc-3.3,我必须使用命令。 如何将默认编译器更改为gcc-3.3?当我执行命令时,它应该调用gcc-3.3而不是gcc-4.4。 另外,如何将ma
问题内容: 从这个答案: 这是被接受的答案建议为您的视图变化设置动画: 不 更改框架时为什么要打电话。我们正在更改约束,所以(根据[另一个答案]我们不应该打电话吗? 如果以后发生的更改使您的约束之一无效,则应立即删除约束并调用setNeedsUpdateConstraints 观察结果: 我实际上确实尝试过同时使用它们。使用我的视图 可以向右正确设置动画 但是,使用 不会 设置动画,它只是将视图
从这个答案中: 以下是公认的答案建议的动画视图更改: 当我们不更改帧时,为什么要调用。我们正在更改约束,所以(根据另一个答案)我们不应该调用? 同样,这个备受好评的答案说: 如果以后发生的某些更改使某个约束无效,则应立即删除该约束并调用setNeedsUpdateConstraints 我确实试过两种方法。使用my view可正确向左设置动画 但是,使用不会设置动画,它只是将视图快速向左移动。 如
就在你说这是一个副本之前,我已经看到了其他的问题,我仍然想发布这个。 所以我读了《用Java思考》--Bruce Eckel,这篇文章是关于小写命名约定的: 在Java1.0和Java1.1中,域扩展com、edu、org、net等都按照惯例大写,因此库将出现:net.mindview.utility.foibles。然而,在Java2的开发过程中,人们发现这会导致问题,所以现在整个包名都是小写的