В Linux есть два типичных способа запроса памяти: sbrk и mmap . Эти системные вызовы имеют серьезные ограничения на частые небольшие выделения. malloc () - это библиотечная функция для решения этой проблемы. Он запрашивает большие куски памяти с помощью sbrk / mmap и возвращает маленькие блоки памяти внутри больших кусков. Это гораздо более эффективно и гибко, чем прямой вызов sbrk / mmap.
В реализации K & amp; R ядро (чаще называемое арена ) представляет собой большой кусок памяти. morecore()
запрашивает ядро из системы через sbrk()
. Когда вы вызываете malloc () / free () несколько раз, некоторые блоки в ядре используются / выделяются, а другие свободны. K & amp; R malloc хранит адреса свободных блоков в циклическом единственном связанном списке. В этом списке каждый узел является блоком свободной памяти. Первые sizeof(Header)
байтов сохраняют размер блока и указатель на следующий свободный блок. Остальные байты в свободном блоке неинициализированы. В отличие от типичных списков в учебниках, узлы в свободном списке являются лишь указателями на некоторые неиспользуемые области в ядрах; Вы фактически не выделяете каждый узел, кроме ядер. Этот список является ключом к пониманию алгоритма.
Следующая диаграмма показывает пример схемы памяти с двумя ядрами / аренами. На диаграмме каждый символ занимает sizeof(Header)
байтов. @
представляет собой Header
, +
отмечает выделенную память и -
отмечает свободную память внутри ядер. В примере есть три выделенных блока и три свободных блока. Три свободных блока хранятся в круговом списке. Для трех выделенных блоков только их размеры хранятся в Header
.
This is core 1 This is core 2
@---------@+++++++++@++++++++++++ @----------@+++++++++++++++++@------------
| | |
p->ptr->ptr p = p->ptr->ptr->ptr p->ptr
В вашем коде freep
является точкой входа в свободный список. Если вы несколько раз будете следовать freep->ptr
, вы вернетесь к freep
- оно круговое. Как только вы поймете круговой односвязный список, остальное сравнительно легко. malloc()
находит свободный блок и, возможно, разбивает его. free()
добавляет свободный блок обратно в список и может объединить его с соседними свободными блоками. Они оба пытаются сохранить структуру списка.
В комментариях к коду упоминается «обтекание» в malloc()
. Эта строка происходит, когда вы прошли весь свободный список, но не можете найти свободный блок, превышающий запрошенную длину. В этом случае вам нужно добавить новое ядро с morecore()
.
base
- это блок нулевого размера, который всегда включен в свободный список. Это хитрость, чтобы избежать специального корпуса. Это не является строго необходимым.
free()
может показаться немного сложным, поскольку для объединения недавно освобожденного блока с другими свободными блоками в списке необходимо рассмотреть четыре разных случая. Эта деталь не так важна, если вы не хотите переопределить ее сами.
Этот пост в блоге объясняет K & amp; R malloc более подробно.
PS: K & amp; R malloc - один из самых элегантных фрагментов кода на мой взгляд. Когда я впервые понял код, это действительно открыло глаза. Мне грустно, что некоторые современные программисты, даже не понимая основ этой реализации, называют шедевр дерьмом исключительно на основании его стиля кодирования.
if($('textarea').length > 0) {
document.write('we have at least one textarea');
}
ИЛИ
if($('textarea').length) {
document.write('we have at least one textarea');
}
Прочтите это из FAQ:
http://docs.jquery.com/Frequent_Asked_Questions#How_do_I_test_whether_an_element_exists.3F
Чтобы расширить ответ karim79.
Со страницы jQuery docs : Примечание: не всегда необходимо проверять, существует ли элемент. Следующий код покажет элемент, если он существует, и ничего не сделает (без ошибок) в противном случае.
Это означает, что вы можете просто сделать:
$(function(){
$("textarea").each(function(i){
this.enableTinyMCE();
})
})
Изменить:
На самом деле существует плагин jQuery разрабатывается для этой цели. Я бы загрузил и опробовал плагин и, если сможете, внесу свой вклад в его разработку.
Я сделал следующее, как было предложено, однако я все еще хочу вызывать enableTinyMCE только в том случае, если на моей странице есть текстовые поля. Я не могу вызвать эту функцию в document.ready. Смотрите Google! Есть идеи?
$(function() {
if ($('textarea').length > 0)
{
var data = $('textarea');
$.each(data, function(i)
{
tinyMCE.execCommand('mceAddControl', false, data[i].id);
}
);
}
});
function enableTinyMCE()
{
tinyMCE.init({
plugins: 'paste',
theme_advanced_toolbar_location: 'top',
theme_advanced_buttons1: 'pastetext,pasteword,copy,cut,separator,bold,italic,underline,separator,bullist,numlist,separator,undo,redo,separator,link,unlink,separator,charmap,separator,formatselect,separator,code',
theme_advanced_buttons2: '',
theme_advanced_buttons3: '',
mode: 'textareas',
theme: 'advanced',
theme_advanced_blockformats: 'None=p,Heading 3=h3,Heading 2=h2'
});
}
tinymce.init нужно вызывать вне documentready, но $ ('textarea'). Length всегда равно нулю за пределами documentready. Помогите!
Селектор jQuery всегда возвращает массив, даже если совпадающие элементы не найдены. Это означает, что вам нужно проверить длину. Попробуйте вместо этого.
if($('textarea').length > 0) {
document.write('we have at least one textarea');
}
Это мое решение
if ($('textarea').length > 0)
{
var data = $('textarea');
$.each(data, function(i)
{
tinyMCE.execCommand('mceAddControl', false, data[i].id);
}
);
$('form').bind('form-pre-serialize', function(e) {
tinyMCE.triggerSave(true,true);
});
}
И чтобы включить tinyMCE, я сделал это
<% if (ViewData["TextAreaVisible"] != null && bool.Parse(ViewData["TextAreaVisible"].ToString()) == true)
{%>
<script type="text/javascript" src="../../Scripts/tinymce/tiny_mce.js"></script>
<script type="text/javascript">
enableTinyMCE();
</script>
<%} %>
EnableTinyMCE делает это
function enableTinyMCE() {
tinyMCE.init({
plugins: 'paste',
theme_advanced_toolbar_location: 'top',
theme_advanced_buttons1: 'pastetext,pasteword,copy,cut,separator,bold,italic,underline,separator,bullist,numlist,separator,undo,redo,separator,link,unlink,separator,charmap,separator,formatselect,separator,code',
theme_advanced_buttons2: '',
theme_advanced_buttons3: '',
mode: 'none',
theme: 'advanced',
theme_advanced_blockformats: 'None=p,Heading 3=h3,Heading 2=h2'
});
}
Стоит отметить, что функции, которые вы ищете, могут обрабатываться самим TinyMCE:
Если вы установите для параметра mode
значение textareas
] в вашем вызове tinyMCE.init (), он автоматически преобразует любые найденные текстовые поля в экземпляры редактора. Если текстовых полей нет, он ничего не сделает.
tinyMCE.init({
...
mode : "textareas",
...
});
И наоборот, вы можете указать TinyMCE преобразовывать только текстовые поля, соответствующие имени класса CSS, используя значение specific_textareas
в режим .
параметр.
tinyMCE.init({
...
mode : "specific_textareas",
editor_selector : "mceEditor"
});
http://wiki.moxiecode.com/index.php/TinyMCE:Configuration/mode