Во-первых, ваш код не является действительным C или действительным C++.
Возможно, вы имели в виду:
char str* = new char[512];
delete[] str;
который действует C++ (не C, потому что new
и delete
являются C ключевые слова ++, а не C них) и работает на Linux, как на Windows, или любой стандартной реализации C++.
Затем str
выделяется в heap (и эта же программа выделяется в куче как на Windows, так и на Linux).
Нет необходимости в posix_memalign(3) (см. Справочную страницу, которую я только что связал) в вашем случае.
Возможно, вы захотите использовать posix_memalign
, если по какой-то определенной причине вы хотите, чтобы указатель был выровнен, например. быть кратным 1024.
Этот пример является глупым, потому что он запрашивает выравнивание 1024 байтов для зоны памяти 512 байт.
Тогда пожалуйста
#define _GNU_SOURCE
#include <new>
#include <stdlib.h>
, а затем в том же C++ исходный файл:
char* str = NULL;
void* ad = NULL;
if (posix_memalign(&ad, 1024, 512))
{ perror("posix_memalign failed"); exit (EXIT_FAILURE); }
str = new(ad) char[512];
но вы должны иметь конкретную причину хотеть выровненный указатель (здесь, кратное 1KByte). Обычно вы не хотите, чтобы указатель был выровнен больше, чем значение по умолчанию. (Вам может потребоваться большое выравнивание, например, при выполнении арифметики на (intptr_t)
отбрасывания ваших указателей, но это очень необычно). Обратите внимание на placement new (предоставляется стандартным заголовком <new>
).
Я рекомендую читать Advanced Linux Programming (что более сфокусировано на C, чем на C++). И всегда компилируйте в Linux все предупреждения, запрошенные компилятором, и информацию об отладке (например, g++ -Wall -g
). Научитесь использовать отладчик gdb
и детектор утечки памяти valgrind
.Если у вашей программы нет ошибок, попросите компилятор оптимизировать полученный код объекта с помощью g++ -Wall -O2
вместо g++ -Wall -g
.
на самом деле, реальная syscalls сделано приложением к Linux kernel (чей список на syscalls(2)) для управления памятью mmap(2) и munmap(2)
(и, возможно, sbrk(2)
который почти устарел). Вы должны использовать команду strace
, чтобы узнать, сколько системных вызовов выполняется процессом.
Нет, это недействительно ... –
Как вы наткнулись на 'posix_memalign', чтобы найти это? – delnan