Форум программистов, компьютерный форум CyberForum.ru

Обнулить элементы вектора через __asm - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Ругается на неоднозначный вызов перегруженной функции http://www.cyberforum.ru/cpp-beginners/thread1140365.html
Делаю все по примерам не могу понять в чем ошибка. Уверен что ошибка элементарная. Ругается на неоднозначный вызов перегруженной функции. Причем на все функции( #include <iostream> #include <cmath> using namespace std; #define Pi 3.14 int main() { int T; double P; int r,t,Y,R,A; cout<<"T = "; cin>>T;
C++ Удаление элемента списка и всего списка Компилируется, но не работает. Что и как исправить? #include <cstdlib> #include <iostream> #include <cstring> #define M 5 using namespace std; struct A { char key ; http://www.cyberforum.ru/cpp-beginners/thread1140351.html
предлоги C++
помогите пожалуйста! Есть предложение в нем надо подсчитать кол-во предлогов! Как это сделать, и что для этого надо почитать
C++ Запуск подпрограмм
Только начал изучать, сильно не пинайте. Запускаю много разных исходников, приходиться каждый раз создавать новый проект, либо все стирать в старом и писать/вставлять новый. Причем IDE не позволяют видеть боьше 1 проекта (Visual2010 & DevCpp) :no: Хочется просто открыть новую вкладку IDE и писать/запускать, не теряя из виду содержимое изначальной вкладки. Пока решил оформлять новые задачи в...
C++ Найти все числа в массиве которые заканчиваются на число 47 http://www.cyberforum.ru/cpp-beginners/thread1140306.html
Помогите пожалуйста решить задачу: Неоходимо найти все числа в массиве (диапазон случайных чисел от 200 до -200) которые заканчиваются на 47 (как я понял вариантов будет не много. -47 47 -147 147) и вывести эти числа с ихними индексами в массиве. Пример: Число -47 | Ряд 2 | Строка 7 Число 147 | Ряд 4 | Строка 8 Знакомый сказал что можно реализовать это задание следующим способом. От...
C++ Метод перебора Пожалуйста помогите решить задачу за оптимальное время МИНИМАЛЬНОЕ ПОКРЫТИЕ УСЛОВИЕ. Заданы набор С подмножеств конечного множества S, положительное целое число K<=C. ВОПРОС. Верно ли, что С содержит покрытие мощности не более K Иными словами, существует ли такое подмножество C1 из C, что |С1|<=K( и любой элемент из S принадлежит по крайней мере одному подмножеству из С1? Комментарий.... подробнее

Показать сообщение отдельно
DrOffset
6851 / 4062 / 927
Регистрация: 30.01.2014
Сообщений: 6,859
07.04.2014, 20:31     Обнулить элементы вектора через __asm
Цитата Сообщение от mat_for_c Посмотреть сообщение
А что именно знать надо?
В общем случае это значит, что нужно знать как конкретный компилятор на конкретной платформе генерирует код.
Про выравнивание примеры есть по ссылке, много.
PS. Если ты надеешься выиграть в скорости таким образом - я тебя разочарую, вряд ли удастся обогнать компилятор, максимум сравняешься в скорости. Зато код будет непереносим и труден в сопровождении.

Добавлено через 10 минут
mat_for_c, вот, к примеру, я написал такой код для обнуления:
C++
1
2
3
4
5
void fill_raw(vector< vector<int> > & v)
{
    memset(&v[0][0], 0, v[0].size() * sizeof(int));
    memset(&v[1][0], 0, v[1].size() * sizeof(int));
}
из которого получилось вот это:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
_fill_raw:
    push    edi
    push    ebx
    mov ebx, DWORD PTR [esp+12]
    mov eax, DWORD PTR [ebx]
    mov edx, DWORD PTR [eax]
    mov ecx, DWORD PTR [eax+4]
    sub ecx, edx
    and ecx, -4
    xor eax, eax
    mov edi, edx
    rep stosb
    mov ecx, DWORD PTR [ebx]
    mov edx, DWORD PTR [ecx+12]
    mov ecx, DWORD PTR [ecx+16]
    sub ecx, edx
    and ecx, -4
    mov edi, edx
    rep stosb
    pop ebx
    pop edi
    ret
mingw32 c оптимизацией -02

Добавлено через 24 минуты
Теперь добавим цикл для общего случая:
C++
1
2
3
4
5
6
7
void fill_raw(vector< vector<int> > & v)
{
    for(int i = 0, s = v.size(); i < s; ++i)
    {
        memset(&v[i][0], 0, v[i].size() * sizeof(int));
    }
}
Получаем:
Кликните здесь для просмотра всего текста
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
_fill_raw:
    push    ebp
    push    edi
    push    esi
    push    ebx
    mov esi, DWORD PTR [esp+20]
    mov ecx, DWORD PTR [esi]
    mov eax, DWORD PTR [esi+4]
    sub eax, ecx
    sar eax, 2
    lea edx, [eax+eax*4]
    lea edx, [eax+edx*4]
    lea edx, [eax+edx*4]
    mov ebx, edx
    sal ebx, 8
    add edx, ebx
    mov ebx, edx
    sal ebx, 16
    add edx, ebx
    lea ebp, [eax+edx*2]
    xor edx, edx
    xor eax, eax
    test    ebp, ebp
    jg  L6
    jmp L2
L9:
    mov ecx, DWORD PTR [esi]
L6:
    lea ebx, [edx+edx*2]
    lea ecx, [ecx+ebx*4]
    mov ebx, DWORD PTR [ecx]
    mov ecx, DWORD PTR [ecx+4]
    sub ecx, ebx
    and ecx, -4
    mov edi, ebx
    rep stosb
    inc edx
    cmp edx, ebp
    jne L9
L2:
    pop ebx
    pop esi
    pop edi
    pop ebp
    ret

В принципе можно отталкиваться от приведенных примеров для написания своего (только с учетом компилятора и версии, конечно же) Но на самом деле я привел их для того, чтобы показать, что компилятор не дурак и код будет эффективен, если изначально правильно написан. А главное его можно будет перенести без проблем на другой компилятор.
 
Текущее время: 11:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru