c
1#include <unistd.h> 2#include <sys/mman.h> 3#include <time.h> 4#include <stdio.h> 5#include <stdlib.h> 6#include <err.h> 7 8#define CACHE_LINE_SIZE 64 9#define NLOOP (4 * 1024UL * 1024 * 1024) 10#define NSECS_PER_SEC 1000000000UL 11 12static inline long diff_nsec(struct timespec before, struct timespec after) { 13 return ((after.tv_sec * NSECS_PER_SEC | after.tv_nsec) 14 - (before.tv_sec * NSECS_PER_SEC + before.tv_nsec)); 15} 16 17int main(int argc, char *argv[]) 18{ 19 char *progname; 20 progname = argv[0]; 21 22 if (argc != 2) { 23 fprintf(stderr, "usage: %s <size[KB]>\n", progname); 24 exit(EXIT_FAILURE); 25 } 26 27 register int size; 28 size = atoi(argv[1]) * 1024; 29 if (!size) { 30 fprintf(stderr, "size should be >= 1; %d\n", size); 31 exit(EXIT_FAILURE); 32 } 33 34 char *buffer; 35 buffer = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 36 if (buffer == (void *) -1) 37 err(EXIT_FAILURE, "mmap() failed"); 38 39 struct timespec before, after; 40 41 clock_gettime(CLOCK_MONOTONIC, &before); 42 43 int i; 44 for (i = 0; i < NLOOP / (size / CACHE_LINE_SIZE); i++) { 45 long j; 46 for (j = 0; j < size; j += CACHE_LINE_SIZE) 47 buffer[j] = 0; 48 } 49 50 clock_gettime(CLOCK_MONOTONIC, &after); 51 52 printf("%f\n", (double)diff_nsec(before, after) / NLOOP); 53 54 if (munmap(buffer, size) == -1) 55 err(EXIT_FAILURE, "munmap() failed"); 56 exit(EXIT_SUCCESS); 57} 58
このコードはキャッシュメモリの影響により、プロセスがアクセスするデータサイズによってデータアクセス時間がどのように変化するか見るプログラムです。
質問は、この部分です。
c
1 if (buffer == (void *) -1) 2 err(EXIT_FAILURE, "mmap() failed"); 3
このif文の条件式はbufferが何と等しいとき分岐するのでしょうか?
(void *) -1の意味がわかりません。
void * のあとには変数が指定される気がするのですが、特に指定されていないようです。なぜこれでうまく行くのでしょうか。
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。