如何在D,C和C++等语言中使用内联x86汇编程序实现alloca()?我想创建一个稍微修改过的版本,但首先我需要知道标准版本是如何实现的.从编译器中读取反汇编并没有帮助,因为它们执行了很多优化,我只想要规范形式.
编辑:我想困难的部分是我希望它具有正常的函数调用语法,即使用裸函数或其他东西,使它看起来像普通的alloca().
编辑#2:啊,到底是什么,你可以假设我们没有省略帧指针.
在大多数主流编程语言中,从函数返回多个值似乎是一件非常尴尬的事情.
典型的解决方案是使任一个结构或一个普通的旧数据类和返回,或者通过引用传递至少一些参数或代替指针返回它们的.
使用引用/指针非常尴尬,因为它依赖于副作用,意味着你还有另一个参数要传递.
类/结构解决方案也是恕我直言,因为你最终得到了一百万个小类/结构,它们只用于从函数返回值,产生不必要的混乱和冗长.
此外,很多时候总是需要一个返回值,其余的只在某些情况下由调用者使用.这些解决方案都不允许调用者忽略不需要的返回类型.
我知道的一种优雅处理多个返回值的语言是Python.对于那些不熟悉的人,它使用元组解包:
a, b = foo(c) # a and b are regular variables.
myTuple = foo(c) # myTuple is a tuple of (a, b)
Run Code Online (Sandbox Code Playgroud)
有没有人对这个问题有任何其他好的解决方案?除了Python之外,现有主流语言中的两种习语以及您在非主流语言中看到的语言级解决方案都是受欢迎的.
python language-agnostic language-design function syntactic-sugar
直到今天,我一直认为正确的编译器会自动将struct pass-by-value转换为pass-by-reference,如果struct足够大,后者会更快.据我所知,这似乎是一个简单的优化.然而,为了满足我对这是否真的发生的好奇心,我在C++和D中创建了一个简单的测试用例,并查看了GCC和Digital Mars D的输出.两者都坚持按值传递32字节结构有问题的函数是添加成员并返回值,没有修改传入的结构.C++版本如下.
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么这样的东西不会被编译器优化为传递引用而不是实际将所有这些推int送到堆栈上?
注意:使用的编译器开关:GCC -O2(-O3内联foo().),DMD -O -inline -release.
编辑:显然,在一般情况下,传值和传递引用的语义将不相同,例如,如果涉及复制构造函数或在被调用者中修改原始结构.但是,在许多现实场景中,语义在可观察行为方面是相同的.这些是我要问的案例.
compiler-construction optimization performance assembly struct
模板方法模式和策略模式大致相同.我理解它们之间的基本差异(模板方法是基于继承,策略是基于组合),但是有什么体面的指导方针可以选择何时选择其中一个?看起来他们做的基本相同.
我希望向D编程语言标准库提交一个补丁,它将允许在编译时使用该语言的编译时功能评估工具评估大部分std.math.编译时功能评估有几个局限性,最重要的是:
有几个std.math函数违反了这些函数,需要编写编译时版本.我在哪里可以获得有关计算诸如对数,指数,幂和三角函数等优良算法的信息?我更喜欢算法的高级描述和实际代码,原因有两个:
为避免法律含糊不清,需要让我的代码看起来与源代码"不同",以确保我拥有版权.
我想要简单,便携的算法.我不关心微优化,只要它们至少是渐近有效的.
编辑:D的编译时函数评估模型允许在编译时计算的浮点结果与运行时计算的浮点结果不同,所以我不在乎我的编译时算法是否提供与运行时版本完全相同的结果只要它们在实际上并不那么准确.
是否与Win32 API中的Linux/Unix stdio.h popen()函数大致相同?如果是这样,我在哪里可以找到它?
编辑:我需要知道这个来修补D标准库中的遗漏.任何答案必须只使用标准的Win32 API,没有特定于MSVC的功能.另外,如果存在的话,我更喜欢低级别的东西.
当谈到正则表达式时,我在学习曲线上的某个地方,我需要使用它们来自动修改一堆C头中的函数原型.有没有人知道一个不错的正则表达式来查找C头中的任何和所有函数原型,同时排除其他所有内容?
编辑:最初不清楚的三件事:
你在D编程语言中做过或看过的最酷的有点实用的元编程黑客是什么?有点实际意味着排除例如编译时光线跟踪器.
为什么BLAS具有gemm矩阵 - 矩阵乘法gemv功能和矩阵向量乘法的单独函数?矩阵向量乘法不是矩阵乘法的一个特例,其中一个矩阵只有一个行/列吗?