как может я клон мерзавца git://foo.git СНОВА?

Три немного отличающихся ответа, зависящие, как Вы смотрите на вопрос:

1) Достаточно хороший для точного вопроса, который задают, решение Jonathan Leffler, за исключением того, что окружить к 16 выровненному, Вам только нужны 15 дополнительных байтов, не 16.

А:

/* allocate a buffer with room to add 0-15 bytes to ensure 16-alignment */
void *mem = malloc(1024+15);
ASSERT(mem); // some kind of error-handling code
/* round up to multiple of 16: add 15 and then round down by masking */
void *ptr = ((char*)mem+15) & ~ (size_t)0x0F;

B:

free(mem);

2) Для более универсальной функции выделения памяти, вызывающая сторона не хочет должной быть отслеживать два указателя (один для использования и один для свободного). Таким образом, Вы храните указатель на 'реальный' буфер ниже выровненного буфера.

А:

void *mem = malloc(1024+15+sizeof(void*));
if (!mem) return mem;
void *ptr = ((char*)mem+sizeof(void*)+15) & ~ (size_t)0x0F;
((void**)ptr)[-1] = mem;
return ptr;

B:

if (ptr) free(((void**)ptr)[-1]);

Примечание, что, в отличие от этого (1), где только 15 байтов были добавлены к мадам, этот код мог на самом деле , уменьшает выравнивание, если Ваша реализация, оказывается, гарантирует 32-байтовое выравнивание от malloc (вряд ли, но в теории реализация C могла иметь выровненный тип 32 байтов). Это не имеет значения, ли все, что Вы делаете, назвать memset_16aligned, но если Вы используете память для структуры тогда, это могло бы иметь значение.

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

[ Добавленный : 'стандартный' прием должен создать объединение, 'вероятно, чтобы быть максимально выровненным типы' для определения необходимого выравнивания. Максимально выровненные типы, вероятно, будут (в C99) 'long long', 'long double', 'void *', или' void (*)(void)'; если Вы включаете , Вы могли бы, по-видимому, использовать' intmax_t' вместо [1 111] (и, на Питании 6 (AIX), машины, intmax_t дадут Вам 128-разрядный целый тип). Требования выравнивания для того объединения могут быть определены путем встраивания его в структуру с единственным символом, сопровождаемым объединением:

struct alignment
{
    char     c;
    union
    {
        intmax_t      imax;
        long double   ldbl;
        void         *vptr;
        void        (*fptr)(void);
    }        u;
} align_data;
size_t align = (char *)&align_data.u.imax - &align_data.c;

Вы тогда использовали бы большее из требуемого выравнивания (в примере, 16) и align значение, вычисленное выше.

На (64-разрядном) Солярисе 10, кажется, что основное выравнивание для результата malloc() является кратным 32 байтам.
]

На практике, выровненные средства выделения часто берут параметр для выравнивания, а не этого быть предрасположенное. Таким образом, пользователь передаст в размере структуры, о которой они заботятся (или наименьшее количество питания 2 больших, чем или равный этому), и все будут хорошо.

3) Использование, что обеспечивает Ваша платформа: posix_memalign для POSIX, _aligned_malloc в Windows.

4) при использовании C11, тогда самое чистое - портативный и краткий - опция состоит в том, чтобы использовать стандартную библиотечную функцию aligned_alloc , которая была представлена в этой версии спецификации языка.

14
задан 8 August 2009 в 10:37
поделиться

5 ответов

git checkout . # revert your changes
git clean -xdf # delete untracked and ignored files
10
ответ дан 1 December 2019 в 14:44
поделиться

Чтобы отменить все ваши изменения, используйте:

git checkout .

Не отслеживаемые файлы (файлы, которые изначально не существовали в дереве, те, которые вы создали и не редактировали), однако не будут удалены. Чтобы найти неотслеживаемые файлы, используйте:

git status

Затем удалите их вручную.

Кстати, если вы хотите сделать копию репо, вам не нужно клонировать исходное репо, вы можете просто клонируйте тот, который у вас уже есть на жестком диске. Пойдите куда-нибудь за пределы foo и выполните:

git clone /path/to/foo
2
ответ дан 1 December 2019 в 14:44
поделиться

Вы можете использовать «git checkout». или "git checkout HEAD -." или даже "git reset --hard HEAD", чтобы сбросить вашу рабочую область до известного состояния (для состояния, записанного в индексе в первом случае, для состояния, записанного в фиксации HEAD во втором и третьем случаях) .

Чтобы удалить неотслеживаемые файлы, которые вы не хотите оставлять, вы можете использовать команду «git clean» (подробности см. В документации ).

Чтобы получить новые изменения из удаленного репозитория, из которого вы клонировали, используйте «git fetch» ​​(или эквивалент «git remote update» после некоторой настройки) или «git pull» (для получения и слияния изменений).

2
ответ дан 1 December 2019 в 14:44
поделиться

Вы также всегда можете использовать

rm -rf *
git checkout master

Less команды, которые нужно запомнить :)

-2
ответ дан 1 December 2019 в 14:44
поделиться

Если вы действительно облажались:

git clean -df
git reset --hard HEAD
0
ответ дан 1 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

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