小编sh5*_*h54的帖子

为什么在调用printf之前%eax归零?

我想拿起一点x86.我正在使用gcc -S -O0在64位mac上进行编译.

C中的代码:

printf("%d", 1);
Run Code Online (Sandbox Code Playgroud)

输出:

movl    $1, %esi
leaq    LC0(%rip), %rdi
movl    $0, %eax        ; WHY?
call    _printf
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在调用'printf'之前%eax被清除为0.由于printf返回打印的字符数量为%eax我最好的猜测,因此将其归零以准备它,printf但我认为printf必须负责准备它.而且,相反,如果我调用自己的功能int testproc(int p1),则gcc认为没有必要准备%eax.所以我想知道为什么gcc对待printftestproc不同.

macos assembly gcc x86-64 cpu-registers

32
推荐指数
3
解决办法
7918
查看次数

自定义调用Action的ASP Web API Json序列化

我正在考虑将现有的JSON api从hacky MVC3实现转换为最新的MVC4 Web Api.MVC3实现使用JSON.NET来完成所有序列化,这将使升级变得美观和流畅.

我坚持定制一些动作的结果如何被序列化.例如,我想要一些动作只返回输出对象的一些属性,而其他动作可能会进行深度序列化.在我当前的实现中,一个动作可以通过在中设置适当的设置来添加一系列序列化覆盖HttpContext.这些后来通过派生自定义的类获取自定义序列化JsonResult.添加自定义的主要用途JsonConverters是控制和减少序列化的键/值的数量,并根据操作改变要序列化的参数(某些操作应返回比其他操作更多的对象参数).

在我当前的MVC3实现中控制器和控制json序列化的类的简洁示例:

public class TestController : JsonController {
    public JsonResult Persons() {
        ControllerContext.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] = new JsonConverter[] {
            new InterfaceExtractorJsonConverter<IPersonForList>(),
            new StringEnumConverter()
        };

        ControllerContext.HttpContext.Items[typeof(IContractResolver)] = new SpecialCamelCasePropertyNamesContractResolver();
     }
}

public class JsonNetResult : JsonResult {
    public override void ExecuteResult(ControllerContext context) {
        var response = context.HttpContext.Response;

        var additionalConverters = context.HttpContext.Items[typeof(IEnumerable<JsonConverter>)] as IEnumerable<JsonConverter> ?? Enumerable.Empty<JsonConverter>();

        var contractResolver = context.HttpContext.Items[typeof(IContractResolver)] as IContractResolver ?? new JsonContractResolver();

        var typeNameHandling = TypeNameHandling.None;
        if (context.HttpContext.Items.Contains(typeof(TypeNameHandling)))
            typeNameHandling = …
Run Code Online (Sandbox Code Playgroud)

c# json.net asp.net-mvc-3 asp.net-web-api

8
推荐指数
1
解决办法
3037
查看次数

C# 中的柯里化表达式

我正在尝试构建一个表达式树,我可以将它输入到 Linq2SQL 中,以便它生成一个漂亮的干净查询。我的目的是构建一个过滤器,将任意一组单词与 AND 和 NOT(或 OR 和 NOT)放在一起。因为我想改变我搜索的字段,所以我最好Expresssion<Func<T, string, bool>>通过调用各种辅助函数来组合一个's列表(其中 T 是我正在操作的实体)。然后我会收到一组单词并循环遍历它们并构建一个Expresssion<Func<T, bool>>up(在必要时否定某些表达式),我最终可以将其提供给 .Where 语句。

我一直在使用 LINQKit PredicateBuilder但这段代码处理单参数表达式。然而,它为我自己的尝试提供了一些基础。我的目标是做这样的事情:

var e = (Expression<Func<Entity, string, bool>>)((p, w) => p.SomeField.ToLower().Contains(w));

var words = new []{"amanda", "bob"};

var expr = (Expression<Func<Entity, bool>>)(p => false);
// building up an OR query
foreach(var w in words) {
    var w1 = w;
>>>>expr = Expression.Lambda<Func<Entity, bool>>(Expression.OrElse(expr.Body, (Expression<Func<Entity, bool>>)(p => e(p, w))));
}

var filteredEntities = table.Where(expr);
Run Code Online (Sandbox Code Playgroud)

但是由于我使用的是表达式,所以用 >>>> 标记的行显然是非法的(不能e(p, w) …

c# t-sql linq currying expression-trees

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