Общее пространство памяти библиотек

Нашли решение в: http://www.abeautifulsite.net/blog/2011/11/detecting-mobile-devices-with-javascript/ .

var isMobile = {
    Android: function() {
        return navigator.userAgent.match(/Android/i);
    },
    BlackBerry: function() {
        return navigator.userAgent.match(/BlackBerry/i);
    },
    iOS: function() {
        return navigator.userAgent.match(/iPhone|iPad|iPod/i);
    },
    Opera: function() {
        return navigator.userAgent.match(/Opera Mini/i);
    },
    Windows: function() {
        return navigator.userAgent.match(/IEMobile/i);
    },
    any: function() {
        return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
    }
};

А затем, чтобы проверить, является ли это Mobile, вы можете проверить, используя:

if(isMobile.any()) {
   //some code...
}

12
задан SpKel 26 May 2017 в 16:46
поделиться

7 ответов

Связанный экземпляр разделяемой библиотеки совместно использует пространство памяти экземпляра исполняемого файла, который связан с ним, прямо или косвенно. Это верно как для Windows, так и для UN * X-подобных операционных систем. Обратите внимание, что это означает, что статические переменные в разделяемых библиотеках не являются способом межпроцессного взаимодействия (что многие думают)

7
ответ дан 2 December 2019 в 21:45
поделиться

Все разделяемые библиотеки совместно используют пространство виртуальной памяти своего процесса . (Включая сам основной исполняемый файл)

2
ответ дан 2 December 2019 в 21:45
поделиться

Если не указано иное, разделяемая библиотека будет совместно использовать память с процессом, в котором она размещена. У каждого экземпляра процесса будет своя собственная копия.

Однако в Windows можно создавать общие переменные, которые позволяют взаимодействовать между процессами. Вы делаете это, помещая их в нужный сегмент. По умолчанию Windows использует два типа сегментов: сегменты данных не являются общими для чтения и записи, тогда как сегменты кода являются исполняемыми и доступны только для чтения. Однако атрибуты чтения-записи и общие атрибуты ортогональны. Общий сегмент чтения-записи в библиотеке может использоваться для хранения общих переменных, и он будет существовать до завершения последнего процесса.

Будьте осторожны с C ++, так как он с радостью запускает конструкторы и деструкторы при запуске и выходе процесса, даже если вы помещаете переменные в общие сегменты.

Подробнее:

2
ответ дан 2 December 2019 в 21:45
поделиться

Общая библиотека имеет то же адресное пространство, что и ее хост-процесс. Так должно быть, иначе вы не сможете передавать указатели из одного модуля в другой, так как они не смогут разыменовать их.

Но хотя они находятся в одном адресном пространстве, это не так. t означает, что все они используют один и тот же диспетчер памяти. Следствием этого является то, что если вы предоставляете функцию, которая выделяет память от имени вызывающего абонента, то вы должны предоставить соответствующую функцию для освобождения этой памяти, скажем, libXXX_destroy () .

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

Ваш объект существует в пространстве памяти вызывающего абонента (фактически, в одном пространстве памяти, совместно используемом библиотекой и основным исполняемым файлом)

0
ответ дан 2 December 2019 в 21:45
поделиться

Совместное адресное пространство, чтобы вы могли совместно использовать указатели, однако они не разделяют распределитель (по крайней мере, не в Windows).

Это означает, что если вы вызываете new для размещения объекта внутри разделяемую библиотеку вы должны вызвать delete внутри той же библиотеки, иначе могут произойти странные вещи.

0
ответ дан 2 December 2019 в 21:45
поделиться

Это правда, что библиотека будет использовать память в каждом процессе, который ее загружает. Однако, по крайней мере, под Windows, когда несколько процессов загружают одну и ту же DLL, немодифицированные страницы (включая все кодовые страницы) незаметно используются совместно. Кроме того, они не занимают места в файле подкачки, поскольку поддерживаются исходным файлом.

Я считаю, что это более сложно для .NET из-за JIT-компиляции, но все равно будет справедливо для сборок с NGENed.

1219] править

Это деталь ВМ. Однако вы также можете пометить сегмент в DLL для совместного использования между процессами.

вы также можете пометить сегмент в DLL для совместного использования между процессами.

вы также можете пометить сегмент в DLL для совместного использования между процессами.

0
ответ дан 2 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

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