2015-12-12 6 views
0

У меня есть код C++, который я хочу преобразовать в код C#. Но я не знаю, как использовать ключевое слово register в C#. Как я могу конвертировать в C# следующий код?C# using register

int InsertNode(register Node **linkp, Node * inserted_node) 
{ 
    register Node *current; 

    while ((current = *linkp) != NULL && current->value > inserted_node->value) 
    { 
     linkp = &current->link; 
    } 

    inserted_node->link = current; 
    *linkp = inserted_node; 
    return TRUE; 
} 

ответ

0

register ничего не делает в C++. В C это подсказка для компилятора, чтобы поместить переменную в регистр, которую она может игнорировать.

Вы можете просто выбросить ключевое слово register. Я был бы удивлен, если он изменит что-либо в результате двоичного.

1

Введенный вами код C использует ключевое слово register, чтобы попытаться принудительно настроить определенную оптимизацию на компиляторе. Это ничего не меняет о том, как работает код, а только о том, как компилятор генерирует машинный код, который в конечном итоге будет работать на процессоре.

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

Что касается C#, хотя ... нет совместимой концепции. Также нет безопасных указателей, поэтому вам придется избавиться от них. Просто используйте ссылки вместо этого, они работают найти для связанных списков.

Попробуйте это: пример

public class LinkedList<T> 
    where T : IComparable<T> 
{ 
    public class Node 
    { 
     public Node link; 
     public T value; 
    } 

    public Node root = null; 


    public bool InsertValue(T value) 
    { 
     return InsertNode(new Node { value = value }); 
    } 

    public bool InsertNode(Node inserted_node) 
    { 
     if (root == null) 
     { 
      root = inserted_node; 
      return true; 
     } 
     Node prev = null; 
     Node current = root; 
     while (current != null && current.value.CompareTo(inserted_node.value) > 0) 
     { 
      prev = current; 
      current = current.link; 
     } 

     prev.link = inserted_node; 
     inserted_node.link = current; 

     return false; 
    } 
} 

Использования:

void Main() 
{ 
    var list = new LinkedList<int>(); 
    list.InsertValue(5); 
    list.InsertValue(2); 
    list.InsertValue(3); 

    for (var c = list.root; c != null; c = c.link) 
     Console.WriteLine(c.value); 
} 
+0

Конечно, вы могли бы просто использовать встроенный ИНТ [ 'LinkedList класса'] (https://msdn.microsoft.com /en-us/library/he2s3bh7.aspx). –

+0

@LucasTrzesniewski Да, но поучительно иногда создавать собственные версии этих вещей. Знание того, как это работает, действительно полезно :) – Corey

+0

Конечно, я давал подсказку, на всякий случай. Я думаю, что код C++ мог быть написан с помощью ['std :: list'] (http://en.cppreference.com/w/cpp/container/list). :) –