Каков максимальный размер буферов memcpy/memset, и т.д. может обработать?

Я бы просто оставил это как комментарий, но я не могу (слишком низкая репутация), но пытаюсь упростить ваш код:

DSolve[{D[y1[t, y2[t]], t] == 3*y1[t, y2[t]],   D[y2[t], t] == 2*y1[t, y2[t]], y1[0, 0] 
== 0, 
y2[0] == 2}, {y1[t, y2[t]], y2[t]}, t]

выдает ошибку

DSolve::ivar2: The independent variable t should not appear in two different arguments of the dependent variable y1[t,y2[t]].

Так что я не совсем уверен, сможете ли вы заставить Mathematica делать то, что вы просите, если я правильно понимаю, что вы хотели. Я предлагаю спросить в Mathematica Stack Exchange , так как они, скорее всего, гораздо более опытны с этими типами проблем.

7
задан Svante 13 April 2009 в 20:55
поделиться

6 ответов

Это полностью зависит от реализации.

Это зависит как от аппаратных средств, так и от возраста компилятора. Для любого, имеющего достаточно современный компилятор (имеется в виду что-либо, основанное на стандарте начала 90-х или более поздних), аргумент size - это size_t . Разумно это может быть самый большой 16-битный без знака, самый большой 32-битный без знака или самый большой 64-битный без знака, в зависимости от модели памяти, к которой компилируется компилятор. В этом случае вам просто нужно узнать, какой размер size_t в вашей реализации. Однако для очень старых старых компиляторов (то есть до ANSI-C и , возможно, для некоторых ранних версий ANSI C ) все ставки отменены.

Со стороны стандартов глядя на Cygwin и Solaris 7, например, аргумент размера - это size_t . Глядя на имеющуюся у меня встроенную систему, аргумент size представляет собой unsigned (имеется в виду 16-битный unsigned). (Компилятор для этой встроенной системы был написан в 80-х годах.) Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

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

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

Глядя на имеющуюся у меня встроенную систему, аргумент size представляет собой unsigned (имеется в виду 16-битный unsigned). (Компилятор для этой встроенной системы был написан в 80-х годах.) Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

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

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

Глядя на имеющуюся у меня встроенную систему, аргумент size представляет собой unsigned (имеется в виду 16-битный unsigned). (Компилятор для этой встроенной системы был написан в 80-х годах.) Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

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

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

аргумент размера - это без знака (имеется в виду 16-битный без знака). (Компилятор для этой встроенной системы был написан в 80-х годах.) Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

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

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

аргумент размера - это без знака (имеется в виду 16-битный без знака). (Компилятор для этой встроенной системы был написан в 80-х годах.) Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

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

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

Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

Возможно, вы захотите посмотреть эту статью на size_t ], а также последующую статью о ошибочной функции некоторых ранних версий GCC, где size_t была ошибочно подписана.

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

Я нашел в Интернете ссылку на некий ANSI C , где параметром размера является int .

Возможно, вы захотите посмотреть эту статью на size_t ], а также последующую статью о ошибочной функции некоторых ранних версий GCC, где size_t была ошибочно подписана.

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

Возможно, вы захотите увидеть эту статью на size_t , а также дополнительную статью о недоработке некоторых ранних версий GCC, где size_t был ошибочно подписан.

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

Возможно, вы захотите увидеть эту статью на size_t , а также дополнительную статью о недостатке некоторых ранних версий GCC, где size_t был ошибочно подписан.

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

11
ответ дан 6 December 2019 в 21:19
поделиться

Функции обычно используют size_t для передачи размера в качестве параметра. Я говорю нормально, потому что fgets () использует параметр int , что, на мой взгляд, является недостатком в стандарте C.

size_t определяется как тип, который может содержит размер (в байтах) любого объекта, к которому вы можете получить доступ. Обычно это typedef из unsigned int или unsigned long .
Вот почему значения, возвращаемые оператором sizeof , имеют тип size_t .

So 2 ** ( sizeof (size_t) * CHAR_BIT ) дает вам максимальный объем памяти, который может обработать ваша программа, но он, безусловно, не самый точный.
( CHAR_BIT определено в limit.h и дает количество битов, содержащихся в char ).

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

Они принимают аргумент size_t; так что это зависит от платформы.

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

Зависит от реализации, но вы можете посмотреть в файле заголовка (.h), который вам нужно включить, прежде чем вы сможете использовать memcpy. Объявление скажет вам (ищите size_t или другое).

И затем вы спрашиваете, что такое size_t, ну, это часть, зависящая от реализации.

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

Правильно, вы не можете копировать области размером более 2 ^ (sizeof (size_t) * 8) байтов. Но не о чем беспокоиться, потому что вы также не можете выделить больше места, потому что malloc также принимает размер как параметр size_t.

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

Существует также проблема, связанная с тем, что size_t может представлять стихи, которые ваша платформа позволит процесс на самом деле адрес.

Даже при использовании виртуальной памяти на 64-битной платформе вы вряд ли сможете вызвать memcpy () с размерами, превышающими несколько ТБ или около того, и даже тогда это довольно горячая машина .... трудно представить, как будет выглядеть машина, на которой можно было бы установить полностью покрытое 64-битное адресное пространство.

Не берите в голову встроенные системы, у которых всего несколько КБ. доступная для записи память, где не имеет смысла пытаться memcpy () больше информации, чем ОЗУ, независимо от определения size_t . Подумайте о том, что только что произошло со стеком, содержащим адрес возврата от этого вызова, если вы это сделали?

Или системы, в которых виртуальное адресное пространство, видимое процессом, меньше установленной физической памяти. Это на самом деле имеет место, например, с процессом Win32, работающим на платформе Win64. (Впервые я столкнулся с этим во время совместного использования ОС TSX-11, работающей на PDP-11, с 4 МБ физической памяти и виртуальным адресом 64 КБ в каждом процессе. Тогда 4 МБ ОЗУ было много памяти, а IBM IBM не существует еще.)

0
ответ дан 6 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

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