Печать указателя на 64-битной системе [дубликат]

Мой способ иметь в виду оба ключевых слова, которые они противоположны друг другу.

override: ключевое слово virtual должно быть определено для переопределения метода. Метод, использующий ключевое слово override, независимо от ссылочного типа (ссылка на базовый класс или производный класс), если он создается с базовым классом, выполняется метод базового класса. В противном случае используется метод производного класса.

new: если ключевое слово используется методом, в отличие от ключевого слова override, тип ссылки важен. Если он создается с производным классом, а ссылочный тип - это базовый класс, выполняется метод базового класса. Если он создается с производным классом, а ссылочный тип - это производный класс, выполняется метод производного класса. А именно, это отличие от ключевого слова override. En passant, если вы забыли или опустите, чтобы добавить новое ключевое слово в метод, компилятор ведет себя по умолчанию при использовании ключевого слова new.

class A 
{
    public string Foo() 
    {
        return "A";
    }

    public virtual string Test()
    {
        return "base test";
    }
}

class B: A
{
    public new string Foo() 
    {
        return "B";
    }
}

class C: B 
{
    public string Foo() 
    {
        return "C";
    }

    public override string Test() {
        return "derived test";
    }
}

Вызов в основном:

A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());

Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());

Выход:

A
B
B
base test
derived test
7
задан cheng 25 August 2011 в 13:55
поделиться

3 ответа

Печать адресов в большинстве реализаций C ++ подавляет ведущие нули, чтобы сделать вещи более читаемыми. 0x00000000000013fd на самом деле не добавляет значения.

Когда вы задаетесь вопросом, почему вы обычно не видите ничего большего, чем 48-битные значения в пользовательском пространстве, это связано с тем, что существующая архитектура AMD64 имеет только 48 бит виртуальных адресное пространство (как можно видеть, например, cat /proc/cpuinfo на linux)

7
ответ дан PlasmaHH 18 August 2018 в 04:08
поделиться
  • 1
    В этой статье Wikipedia (да, я знаю) говорится, что определение архитектуры допускает до 64 бит, но в текущих реализациях используется только 48. Неправильно ли это? en.wikipedia.org/wiki/Amd64#Architectural_features – AndrzejJ 25 August 2011 в 14:16
  • 2
    @AndrzejJ Ну, это «64-битный». архитектура и номинально указатели 64 бит. Просто виртуальное адресное пространство на 256 ТБ более чем достаточно, и вы сохраняете провода (и, следовательно, мощность), если вы можете просто предположить, что более высокие 16 бит каждого указателя равны нулю. – Voo 25 August 2011 в 14:26

Они там - они никуда не ушли - это просто форматирование в потоке.

EDIT: во-вторых, я не думаю, что есть хороший способ изменить форматирование по умолчанию operator<< для указателей , Атрибуты fill и width могут быть изменены, если вы выполняете потоковое вещание с помощью манипулятора std::hex.

3
ответ дан Nim 18 August 2018 в 04:08
поделиться
  • 1
    Поэтому, если адрес какого-либо объекта равен 0x400c10, это означает, что 5 байтов ведущих нулей опущены, правильно? – cheng 25 August 2011 в 14:00
  • 2
    @ user508305 Возможно, но обратите внимание, что все указатели не обязательно имеют тот же размер, что и возможность адресации платформы. – Let_Me_Be 25 August 2011 в 14:02
  • 3
    В каком случае они имеют разный размер? Можете ли вы рассказать об этом больше или просто дать мне несколько ключевых слов, чтобы я мог это сделать. – cheng 25 August 2011 в 14:06
  • 4
    Рассмотрим функцию-указатель-член. Они часто хранятся как более чем одно машинное слово, так что они могут обрабатывать виртуальные функции. – Managu 25 August 2011 в 14:47

Для удовольствия вы можете использовать вывод C и посмотреть, похоже ли это на то, что вам нужно:

printf("0x%p");
1
ответ дан noelicus 18 August 2018 в 04:08
поделиться
Другие вопросы по тегам:

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