Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

180
Visualizações
¿Cómo asignar memoria que está alineada con el tamaño de página?

Necesito asignar memoria que debe estar alineada con el tamaño de la página. Necesito pasar esta memoria a un código ASM que calcula xor de todos los bloques de datos. Necesito hacer esto con malloc() .

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Hay funciones para esto que se supone que debes usar.

Si no puede, por alguna razón, entonces la forma en que generalmente se hace es agregando el tamaño del bloque al tamaño de la asignación, luego usando trucos matemáticos de números enteros para redondear el puntero.

Algo como esto:

 /* Note that alignment must be a power of two. */ void * allocate_aligned(size_t size, size_t alignment) { const size_t mask = alignment - 1; const uintptr_t mem = (uintptr_t) malloc(size + alignment); return (void *) ((mem + mask) & ~mask); }

Esto no ha sido probado muy profundamente, pero entiendes la idea.

Tenga en cuenta que se vuelve imposible averiguar el puntero adecuado para free() la memoria más tarde. Para arreglar eso, tendríamos que añadir alguna maquinaria adicional:

 typedef struct { void *aligned; } AlignedMemory; AlignedMemory * allocate_aligned2(size_t size, size_t alignment) { const size_t mask = alignment - 1; AlignedMemory *am = malloc(sizeof *am + size + alignment); am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask); return am; }

Esto envuelve un poco el truco del puntero y le da un puntero que puede free() , pero necesita eliminar la referencia al puntero aligned para obtener el puntero alineado correctamente.

over 4 years ago · Santiago Trujillo Relatório

0

No creo que sea posible solo con malloc. Puedes usar memalign() :

 char *data = memalign(PAGESIZE, alloc_size);

Donde PAGESIZE es el tamaño de una página y alloc_size es el tamaño de la memoria que se asignará.

El tamaño de la página se puede encontrar con sysconf(_SC_PAGESIZE) .

over 4 years ago · Santiago Trujillo Relatório

0

Utilice posix_memalign para obtener memoria ya alineada.

Nota: valloc y memalign están obsoletos.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda