Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
1

Не понимаю исходников FW4, особенно место с диркетивами препроцессора

23.09.2012, 01:15. Показов 770. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Декомпилил исходники фреймворка, не могу понять, особенно место с диркетивами препроцессора
C#
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
46
47
48
49
50
51
 private unsafe static bool EqualsHelper(String strA, String strB) 
        { 
            Contract.Requires(strA != null);
            Contract.Requires(strB != null); 
            int length = strA.Length;
            if (length != strB.Length) return false;
 
            fixed (char* ap = &strA.m_firstChar) fixed (char* bp = &strB.m_firstChar) 
            {
                char* a = ap; 
                char* b = bp; 
 
                // unroll the loop 
#if AMD64
                // for AMD64 bit platform we unroll by 12 and
                // check 3 qword at a time. This is less code
                // than the 32 bit case and is shorter 
                // pathlength
 
                while (length >= 12) 
                {
                    if (*(long*)a     != *(long*)b) return false; 
                    if (*(long*)(a+4) != *(long*)(b+4)) return false;
                    if (*(long*)(a+8) != *(long*)(b+8)) return false;
                    a += 12; b += 12; length -= 12;
                } 
#else
                while (length >= 10) 
                { 
                    if (*(int*)a != *(int*)b) return false;
                    if (*(int*)(a+2) != *(int*)(b+2)) return false; 
                    if (*(int*)(a+4) != *(int*)(b+4)) return false;
                    if (*(int*)(a+6) != *(int*)(b+6)) return false;
                    if (*(int*)(a+8) != *(int*)(b+8)) return false;
                    a += 10; b += 10; length -= 10; 
                }
#endif 
 
                // This depends on the fact that the String objects are
                // always zero terminated and that the terminating zero is not included 
                // in the length. For odd string sizes, the last compare will include
                // the zero terminator.
                while (length > 0)
                { 
                    if (*(int*)a != *(int*)b) break;
                    a += 2; b += 2; length -= 2; 
                } 
 
                return (length <= 0); 
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2012, 01:15
Ответы с готовыми решениями:

Ответьте на один маленький вопрос. Есть одно место в программе которое я не понимаю.
Вот, например, задача когда нужно вычислить периметр и площадь треугольника по еего координатам...

Фрагмент времени исходников в Sony Vegas. (просмотр таймлайна исходников)
Добрый день участники форума, на сегодняшний день мне после создания видео ролика из более чем 10...

Директивы препроцессора Составить программу, использующую директивы препроцессора
1) Задать константы M1,M2,...,M5 и вычислить M1+ 2M2 + 3M3 + 4M4 + 5M5 2) С помощью директив #if,...

Приложения с FW4 не работают на Windows XP
Может уже баянистая тема, может нет :swoon: Проблема в том, что скомпилированные программки на...

6
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
23.09.2012, 09:58 2
Платформенная оптимизация - на 64-битных АМД идет сравнение блоками по 64 бита - быстрее доступ к памяти.
Какой именно момент не понятен?
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2012, 10:03  [ТС] 3
kolorotur, почему идет дискретизация по 2? (4 в случае амд)? Я понимаю, что он дворды (кворды в случае амд) проверяет, но разве его вторая половина не интересует? АА, поэтому мы и делаем приведение к тому типу, который съедает все это. Понял. спасибо (int в случае прыжка по 2 и long - по 4).
0
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
23.09.2012, 10:09 4
Psilon, так размер указателя char* равен двум байтам, т.к. UTF-16.
Фактически в каждой строке адрес увеличивается на 8 (АМД) и 4 байта, то есть на 64 и 32 бита - размер long и int соответственно.
C#
1
2
char* a = 0x00;
a += 4; // 0x08
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2012, 10:13  [ТС] 5
kolorotur, да я понял, поэтому я и говорю (в последних строчках). Но спасибо еще раз за разьяснения. После небольшого прочтения кернигана ритчи стал получше разбираться в таких записях
0
Эксперт .NET
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,219
23.09.2012, 10:17 6
Цитата Сообщение от Psilon Посмотреть сообщение
в последних строчках
Либо вы последние строчки дописали пока я ответ писал, либо у меня моск с утра не полностью текст воспринимает.
0
Psilon
23.09.2012, 10:24  [ТС]     Не понимаю исходников FW4, особенно место с диркетивами препроцессора
  #7

Не по теме:

kolorotur, ну я почти сразу дописал, все же только 10 минут на это дается, так что наверное Вы еще не проснулись :)

0
23.09.2012, 10:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2012, 10:24
Помогаю со студенческими работами здесь

Будет ли работать программа, написанная на основе FW4 на машинах с версией FW ниже?
Здравствуйе, скажите пожалуйста, если я пишу программку на основе Net. Framework 4, то эта...

Перестроить проект с FW4.0 на 2.0 с учетом того, что большая часть кода использует Linq
Ситуация сложилась так, что надо написать прогу для старого компа, на котором стоит Framework 2.0....

Потеря производительности, особенно в играх
Всем привет, у меня такой вопрос, даже не знаю куда его определить, но в последнее время,...

Зависает пк со звуком тр (особенно в играх)
Всем привет , у меня тут проблема с лагами 1 - 3 секунды с зацикливанием звука тр. Появляется...

Тоормозит ОС, особенно при проигрывании медиа
Всем привет! Братцы выручайте! Вроде не лох в компах, но этот ноут мне не поддается. Симптомы:...

ISO с ADB Tools (особенно logcat)
Нужен исошник, который можно вставить, и человек будет видеть logcat с устройства (желательна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru