C указатели по сравнению с указателями Objective C

Я сожалею, что Ben Collins потерял свои раздвижные окна mmap исходный код. Это было бы хорошо иметь в Повышении.

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

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

, Если запись не начинает на getpagesize () границу, Ваше отображение должно начаться на предыдущей странице. Длина отображенного региона расширяется от первого байта записи (округленный в меньшую сторону при необходимости до самого близкого несколько getpagesize ()) к последнему байту записи (окруженный к самому близкому несколько getpagesize ()). Когда Вы закончены, обработав запись, можно не отобразить () ее и идти дальше к следующему.

это все работает просто великолепно в соответствии с Windows слишком использующий CreateFileMapping () и MapViewOfFile () (и GetSystemInfo () для получения SYSTEM_INFO.dwAllocationGranularity---не SYSTEM_INFO.dwPageSize).

7
задан Dave Gallagher 1 August 2010 в 17:09
поделиться

7 ответов

В вашем первом примере x и pointerX имеют разные типы ( (int) и (int * ) соответственно). Во втором примере string и stringPointer имеют одинаковый тип ( NSString * ). Попробуйте вместо этого:

NSString *string = @"Caramel coffee", **stringPointer;
19
ответ дан 6 December 2019 в 05:03
поделиться

& строка имеет тип NSString ** , тогда как stringPointer имеет тип NSString * , таким образом, предупреждение. Затем вы пытаетесь назначить экземпляр NSString (с типом NSString * ) переменной типа NSString , что приводит к ошибке.

3
ответ дан 6 December 2019 в 05:03
поделиться

Ваша NSString * строка сама по себе является указателем. Следовательно, чтобы указать на него, вам необходимо объявить stringPointer как указатель на указатель. То есть объявите stringPointer следующим образом:

NSString **stringPointer;

Тогда все должно работать. Обратите внимание, что такая же семантика указателя применяется в C и Objective-C.

10
ответ дан 6 December 2019 в 05:03
поделиться

Вопрос в том, являются ли ваши строки константными или нет?
Первый пример, вероятно, подойдет.
Даже в необъективных компиляторах C буквальные строки могут быть помещены в константную память с помощью параметров компоновщика / компилятора.

В этой строке: stringPointer = & строка; Вы копируете адрес указателя в строковый указатель. Совершенно несовместимо.

И в этой строке:
* stringPointer = @ "Шоколадный молочный коктейль";

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

1
ответ дан 6 December 2019 в 05:03
поделиться

Всегда полезно определять каждую переменную в отдельной строке. Когда вы переписываете исходный код цели типа

NSString* string = @"Caramel coffee";
NSString* stringPointer;

, многое становится ясным.

2
ответ дан 6 December 2019 в 05:03
поделиться

What are you trying to do?

Not sure if it will work as you intended.

You seem to be taking concepts from C and apply it to Cocoa classes, I thought you were learning C. Have you seen anywhere in Objective-C code taking address of an object?

Cocoa classes are implemented using Class clusters which mean that they share the same interface but you will get specific extended class which you manipulate.

In your case you are taking address of possibly class that extends NSString and assign it to pointer to NSString.

Example:

NSString * str = @"Caramel coffee";
NSString * str2 = [NSString stringWithString:@"all"];

NSLog(@"%@", [[str class] className]);
NSLog(@"%@", [[str class] className]);

Output (GNUStep linux):

2009-12-08 10:49:29.149 x[25446] GSCInlineString
2009-12-08 10:49:29.149 x[25446] NSConstantString

... apart from the obvious pointer definition problems pointed out by others.

0
ответ дан 6 December 2019 в 05:03
поделиться

The thing is that when you create an object, you actually always manipulate it through a pointer assigned to it, hence (NSString *).

Try doing the same thing in C (working with a string), perhaps it becomes clearer:

void myFunction()
{
    char *string = "this is a C string!";
    char **ptr=&string;


    // Prints: "this is a c string"
    printf("ptr points to %s: \n",  *ptr);
}

As you can see, pointers work in exactly the same way as they do in objective-c. Bare in mind that there are very few primitives in objective-c (int is the most obvious one). Most of the time you are creating a pointer of type object X (say NSString), and then allocating a chunk of memory (through [[Object alloc] init]) and assigining the start address of that chunk to your pointer. Exactly the same as we've done in C with our string.

5
ответ дан 6 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

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