Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Visual C (2008) самовольно вставляет memcpy! Надоело 
:(
    Опции темы
0xDEAD
Дата 12.10.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



Добрый день.

Такая ситуация: есть у меня маленький проект, в котором я отключил все библиотеки, CRT, итд., пользуюсь только C и Winapi.

И следующий код:
Код

        do
            *(sizet_p_dest++) = *(sizet_p_src++);
        while(--count);


Выдает мне вот такую ошибку:
Цитата
error LNK2001: unresolved external symbol memcpy


То есть, вижуал типа оптимизирует мой код своим memcpy, который я отключил.
Как ему объяснить, что делать этого не надо?

Спасибо!
PM MAIL   Вверх
ИванМ
Дата 13.10.2009, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: нет
Всего: 23



Напиши такой код, который не надо было бы оптимизировать. 
PM MAIL   Вверх
0xDEAD
Дата 13.10.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



Я так и делаю, выкручиваюсь непонятно как.
Но это ж не правильно, в конце концов!
Например тут, как можно написать, чтоб "не надо было бы оптимизировать"?
Компилятор что, не может проверить, подключены у меня рантаймы или нет? -_-
PM MAIL   Вверх
jonie
Дата 13.10.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



0xDEAD, ту уверен что на эти строки он пытается вставить memcpy ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
0xDEAD
Дата 13.10.2009, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



Крмментирую - компилируется
Могу попробовать накатать простой проект, в котором это проявляется
PM MAIL   Вверх
maxim1000
Дата 14.10.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



точного названия опции не помню, но что-то типа "intrinsic functions"


--------------------
qqq
PM WWW   Вверх
0xDEAD
Дата 14.10.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 20.9.2009

Репутация: нет
Всего: 3



И так, по моему я нашел багу в коипиляторе 0_o

Вот мой код:
Код

#include <windows.h>

#define STR_TEST \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa" \
    "aaaaaaaaaaaaaaaa"

void MyCopyMemory(PVOID Destination, const VOID *Source, SIZE_T Length);

char a[sizeof(STR_TEST)];

int main()
{
    // ERROR
    MyCopyMemory(a, STR_TEST, sizeof(STR_TEST));

    // NO ERROR
    //MyCopyMemory(a, STR_TEST, 87);

    // ERROR
    //MyCopyMemory(a, STR_TEST, 88); // 0x58

    // ERROR
    //MyCopyMemory(a, STR_TEST, 135);

    // NO ERROR
    //MyCopyMemory(a, STR_TEST, 136); // 0x88

    return 0;
}

__forceinline 
void MyCopyMemory(PVOID Destination, const VOID *Source, SIZE_T Length)
{
    SIZE_T *sizet_p_dest, *sizet_p_src;
    unsigned char *uchar_p_dest, *uchar_p_src;
    SIZE_T count;

    sizet_p_dest = (SIZE_T *)Destination;
    sizet_p_src = (SIZE_T *)Source;

    count = Length/sizeof(SIZE_T);
    if(count)
    {
        do
            *(sizet_p_dest++) = *(sizet_p_src++);
        while(--count);
    }

    uchar_p_dest = (unsigned char *)sizet_p_dest;
    uchar_p_src = (unsigned char *)sizet_p_src;

    count = Length & (sizeof(SIZE_T)-1);
    if(count)
    {
        do
            *(uchar_p_dest++) = *(uchar_p_src++);
        while(--count);
    }
}


Получается, копирование блока размеров с 88 до 135 заменяется функцией memcpy, но получается это только если компилировать 64-битный код.
В 32-битном режиме воспроизвести не получилось, хотя точно помню, что такая ситуация у меня как-то была.

В аттаче проект, коипилировать как x64 - Release.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test.rar 1,91 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.