Почему VC ++ Строки не является считаемой ссылкой?

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

new_cursor = new_connection.cursor()
cursor.execute(new_query)

, и вы хотели посмотреть, доступно ли это соединение для использования другим курсором. Вы могли бы быть в состоянии сделать что-то вроде:

if (new_cursor.rowcount == -1):
    another_new_cursor = new_connection.cursor()
    ...

Конечно, все это действительно говорит вам о том, что курсор еще ничего не выполнил с момента последнего закрытия. Он может указывать на выполненный курсор (и, следовательно, на соединение, которое было закрыто), или он может указывать на курсор, который был только что создан или присоединен к соединению. Другой вариант - использовать цикл try / catch, что-то вроде:

try:
    another_new_cursor = new_connection.cursor()
except ConnectionError?: //not actually sure which error would go here but you get the idea.
    print("this connection is busy.")

Конечно, вы, вероятно, не хотите получать спам с печатными сообщениями, но вы можете делать что угодно в этом кроме блокировки, ожидания в течение 5 секунд, ожидания передачи другой переменной, ожидания ввода пользователя и т. д. Если вы ограничены PEP 249, вам придется многое делать с нуля. Есть ли причина, по которой вы не можете использовать внешние библиотеки?

РЕДАКТИРОВАТЬ: Если вы хотите выйти за пределы PEP 249, вот кое-что, что может работать, но это может не подходить для ваших целей. Если вы используете библиотеку Python mysql, вы можете воспользоваться методом is_connected.

new_connection = mysql.connector.connect(host='myhost',
                         database='myDB',
                         user='me',
                         password='myPassword')

...stuff happens...

if (new_connection.is_connected()):
    pass
else:
    another_new_cursor = new_connection.cursor()
    ...
13
задан Artyom 1 April 2009 в 19:33
поделиться

5 ответов

Я думаю что все больше std::string реализации переедут от refcounting/copy-on-write, поскольку это часто - противооптимизация в многопоточном коде.

См. статью Optimizations That Are Herb Sutter не (В Многопоточном Мире).

22
ответ дан 1 December 2019 в 17:51
поделиться

Фактический STL требует что при использовании подсчета ссылок, что семантика совпадает с для не ссылки считаемой версией. Это не тривиально для общего случая. (Который является, почему Вы не должны писать Ваш на строковом классе).

Из-за следующей ситуации:

std::string   x("This is a string");
char&         x5 = x[5];
std::string   y(x);

x5 = '*';

См.: http://www.sgi.com/tech/stl/string_discussion.html для получения дополнительной информации

11
ответ дан 1 December 2019 в 17:51
поделиться

Возможно, Microsoft решила, что строка, копирующая, не была большой проблемой как почти вся передача использования кода C++ ссылкой по мере возможности. Поддержание подсчета ссылок имеет издержки в пространстве и времени (игнорирующий блокирующий), что, возможно, они решили, не стоило платить.

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

5
ответ дан 1 December 2019 в 17:51
поделиться

Как указано Martin & Michael, Копия на записи (COW) часто является большей проблемой, чем это стоит, поскольку дополнительные материалы для чтения видят эту превосходную статью Kelvin Henney о Коровьем бешенстве, и я полагаю, что это был Andrei Alexandrescu, который заявил, что Маленькая Строковая Оптимизация работает лучше во многих приложениях (но я не могу найти статью).

Маленькая Строковая Оптимизация состоит в том, где Вы заставляете строку возразить больше и избежать выделений "кучи" для маленьких строк. Игрушечная реализация будет выглядеть примерно так:

class string {
    char *begin_, *end_, *capacity_;
    char buff_[64]; // pick optimal size (or template argument)
public:
    string(const char* str)
    {
        size_t len = strlen(str);
        if (len < sizeof(buff_))
        {
            strcpy(buff_, str);
            begin_ = buff_;
            capacity_ = buff_ + sizeof(buff_);
        }
        else
        {
            begin_ = strdup(str);
            capacity_ = begin_ + len;
        }
        end_ = begin_+len;
    }

    ~string()
    {
        if (begin_ != buff_)
            free(begin_); // strdup requires free 
    }
    // ...
};
7
ответ дан 1 December 2019 в 17:51
поделиться

Это не главная причина, но я видел много неправильного кода под win32 платформой, которое делает что-то как const_cast< char* >( str.c_str() ).

Возможно, Microsoft знает это, и заботится о разработчиках :)

1
ответ дан 1 December 2019 в 17:51
поделиться
Другие вопросы по тегам:

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