memcpy по сравнению с присвоением в C

Запрос в отношении диапазона дат (определенного месяца или дня) в Cookbook MongoDB имеет очень хорошее объяснение по этому вопросу, но ниже - это то, что я опробовал самостоятельно и это работает.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

Основываясь на моих экспериментах, вам нужно будет сериализовать ваши даты в формате, поддерживаемом MongoDB, потому что следующее дало нежелательные результаты поиска.

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

Во втором примере результаты не ожидались, но все же был получен один. Это связано с тем, что выполняется базовое сравнение строк.

23
задан Setjmp 27 November 2008 в 15:17
поделиться

1 ответ

Вы никогда не должны ожидать их, превосходят присвоения по характеристикам. Причина, компилятор будет использовать memcpy так или иначе, когда это будет думать, что было бы быстрее (если Вы используете, оптимизируют флаги). Если не и если структура разумна маленький, что она вписывается в регистры, прямое управление регистром могло использоваться, который не потребует никакого доступа к памяти вообще.

GCC имеет специальные шаблоны перемещения блока внутренне, что фигура, когда непосредственно изменить регистры / элементы памяти, или когда использовать memcpy, функционирует. Отметьте при присвоении структуры, компилятор знает во время компиляции, как большой перемещение будет, таким образом, это может развернуть маленькие копии (сделайте перемещение n-времена последовательно вместо цикличного выполнения), например. Примечание -mno-memcpy:

-mmemcpy
-mno-memcpy
    Force (do not force) the use of "memcpy()" for non-trivial block moves.  
    The default is -mno-memcpy, which allows GCC to inline most constant-sized copies.

, Кто знает это лучше, когда использовать memcpy, чем сам компилятор?

35
ответ дан Johannes Schaub - litb 29 November 2019 в 02:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: