Строковые константы иногда лучше определяются как макросы, так как можно сделать больше со строковыми литералами, чем с const char *
.
, например, Строковые литералы может быть , легко конкатенировал .
#define BASE_HKEY "Software\\Microsoft\\Internet Explorer\\"
// Now we can concat with other literals
RegOpenKey(HKEY_CURRENT_USER, BASE_HKEY "Settings", &settings);
RegOpenKey(HKEY_CURRENT_USER, BASE_HKEY "TypedURLs", &URLs);
, Если бы const char *
использовались тогда, своего рода строковый класс должен был бы использоваться для выполнения конкатенации во времени выполнения:
const char* BaseHkey = "Software\\Microsoft\\Internet Explorer\\";
RegOpenKey(HKEY_CURRENT_USER, (string(BaseHkey) + "Settings").c_str(), &settings);
RegOpenKey(HKEY_CURRENT_USER, (string(BaseHkey) + "TypedURLs").c_str(), &URLs);
Все, что показывает, - это то, что память объектов используется повторно, а не то, что новые объекты не создаются. На каждой итерации коллекция
перезаписывается, поэтому счетчик ссылок на предыдущий объект падает, и интерпретатор Python может освободить свою память и повторно использовать ее (для следующего объекта).
>>> for a in range(1,5):
... b = object()
... print b, id(b)
...
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9470> 3084620912
В этом случае 2 памяти локации используются повторно. Если бы вы добавили его в список (или сохранили в другом месте), он был бы сохранен:
>>> a = []
>>> for b in range(1,5):
... c = object()
... a.append(c)
... print c, id(c)
...
<object object at 0xb7db9470> 3084620912
<object object at 0xb7db9468> 3084620904
<object object at 0xb7db9478> 3084620920
<object object at 0xb7db9480> 3084620928
из документации Python:
id () Вернуть «идентичность» объекта. Это целое число (или длинное целое число), которое гарантированно будет уникальным и постоянным для этого объекта в течение его времени жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id ().