1. C# / Говнокод #13949

    +131

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    private unsafe bool IsOptionalOutParamSet(out Guid param)
    {
        fixed (Guid* guidPtr = &param)
            return (IntPtr) guidPtr != IntPtr.Zero;
    }

    Запостил: Ccik, 15 Октября 2013

    Комментарии (26) RSS

    • кто-нибудь, объясните мне, что они хотели этим сделать?
      Ответить
    • Видимо, я отстал от жизни. Что в C# делает fixed?
      Ответить
      • гугл же
        http://msdn.microsoft.com/ru-ru/library/f58wzh21.aspx
        Ответить
        • Лень же. А 2х словах? )
          Ответить
          • Ну там же в первом предложении в 2-х словах всё написано - не даёт сборщику мусора перемещать указатель на объект.
            Ответить
            • А он это делает? В jvm дефрагментирует память только с параметром.
              Ответить
              • Он может это делать при переносе объектов из поколения в поколение, чтобы освобождать память большимы кусками. Делает он это или нет - я не знаю, а выяснять мне лень.
                Ответить
                • Т.е. тиоритически может, а так - хз?
                  Ответить
                  • http://msdn.microsoft.com/en-us/library/ms973837.aspx

                    Т.е. еще как двигает объекты и меняет указатели. И причем делает это как при полной сборке, так и при частичной сборке gen0.

                    Что он делает с pinned объектами, которые прикололи с помощью fixed - х.з. Но судя по фразе "Excessive pinning of objects can increase fragmentation" он тупо их не трогает, и аллокатору потом приходится обходить эти объекты стороной, выделяя память за ними, если перед ними не получилось. От чего в куче остаются дырки. Но т.к. pinned объектов в нормальной проге не так много - всем похуй ;)
                    Ответить
                    • P.S. Еще пишут, что в серверном режиме каждому треду дается отдельная куча, и поэтому на pinned данные всем похуй вдвойне. Пока поток в нативном коде, его куча не собирается. А когда он вернется - он, скорее всего, отпустит объект, и сборщику никто мешать не будет.

                      А если данные надо постоянно держать по одному адресу, потому что к ним лезут нативные треды, то их всяко можно выделить из нативной неуправляемой кучи.
                      Ответить
        • И всё равно, не понятно, нафига оно вообще надо, кроме бонусных граблей.
          Ответить
          • Например реализация pin_ptr для interopа
            Ответить
          • позволяет нативному коду обратиться напрямую к объекту. полезно например когда нужно послать массив на видеокарту в OpenGL, не нужно специальных буферов создавать как в Java и копировать туда-сюда
            Ответить
          • Костыль для нативного кода?
            Ответить
            • не костыль а очень умное решение, куда умнее явы.
              t. стив баллмер
              Ответить
      • Фиксирует. Переменнную. В куче. Что бы дядя GC не уволок ее
        Ответить
    • Может это для какого-нибудь интерфейса с программой на Си, где нужно гарантировать, что указатель мусорщик не заменит на другой? В JNI / CFFI например это известная проблема, т.как эти оболочки сами по себе не следят за тем, чтобы объекты в куче не перемещались.
      Ответить
      • шарп и сам по себе байтоебство позволяет
        Ответить
      • да, это так. алсо, когда .NET проводит сборку мусора, он игнорирует треды, которые в текущий момент находятся в режиме интеропа, т.к. они работают только с фиксированными объектами которые GC передвигать не разрешено, а поэтому они по определению не могут ничего повредить. всё это ускоряет весь процесс намного (плюс не нужно копировать буферы туда-сюда как в Явке)
        Ответить
    • Кроме весьма странного использования out-параметра ничего крименального не увидел - все более ли менее путем, хоть и очень странно.
      Ответить

    Добавить комментарий