C++ Libraryler hakkında sorular(aklıma takılan sorular)

merhabalar C++ da libraryler hakkında sorularım var
şimdi

  • biz bir libdeki sadece bir şeyi kullandık diyelim ama linklerken hepsini linklemiyor mu o zamanda performans kaybı olmaz mı?
    ~mesela iostreamin include direktifi kullanılarak projeye dahil edilmiş basit bir cpp dosyasına bakıyorum 5000 satır oluyor (.i dosyası olarak görünce) ve tek şey kullanılmış std::cout

  • library dosyaları nasıl oluşturulur ?

  1. Library’leri kullanmak performans kaybı yaşatır. Bütün diller için geçerlidir bu olay.

C#'ta

Console.WriteLine("Hello World!");

Bunun yerine library koymadan

System.Console.WriteLine("Hello World!");

yazabiliriz.

  1. Bildiğiniz gibi kod yazarken metotlar oluştururuz. Bu metotları sınıfların içinde barındırırız. Sınıfların birleşimi ise library’lerdir.

Daire çizmek istiyorsunuz diyelim. Matematik işlemi yapmanız lazım x,y ayarlamaları pi falan karışıyor. Bakıyorsunuz birisi yapmış mı daha önce kod olarak. Adamda onu sade kod halinde paylaşmıyor. Library’ler oluşturuyor içine koyuyor. Sizde metot çağırır gibi çağırıyorsunuz.

İzlenecek yol: Statik kitaplık oluşturma ve kullanma (C++) | Microsoft Docs

Madem hortlamis:

"Performans"i calisan kodun hizi icin kullaniyorsak; hayir, olmaz. Dosya buyuklugu sadece dosyanin yuklenme esnasi gibi nadir olan olaylarda hiz kaybina yol acar.

Bununla birlikte, linklenmeyen fonksiyonlari cikartan optimizasyonlar gordugumu hatirliyorum.

Bu compile asamasinda olan bir sey ve yukarida bahsettigimiz linklemeden bagimsiz.

Kullanilan header’larin buyuklugu preprocessor ve compiler performansini etkiler, baska bir seyi degil.

Header’lar text editor ile. Static/dynamic calistirilabilirler ise turlu compiler/linker opsiyonlari kullanilarak.

1 Beğeni

hello.c:

#include <stdio.h>

void print_hello(void)
{
	puts("Hello!\n");
}
$ gcc -c hello.c -o hello.o
$ nm -g hello.o
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T print_hello
                 U puts

main.c:

extern void print_hello(void);

int main(void)
{
	print_hello();
	return 0;
}
$ gcc main.c hello.o -o main1
$ ./main1
Hello!
$ ar rcs libhello.a hello.o
$ nm -g libhello.a

hello.o:
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T print_hello
                 U puts
$ gcc -L. main.c -lhello -o main2
$ ./main2
Hello!
$ gcc -s -fPIC -shared hello.o -o hello.so
$ nm -gD hello.so
                 w __cxa_finalize
                 w __gmon_start__
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000001119 T print_hello
                 U puts

main_dyn.c:

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	void *handle = dlopen("./hello.so", RTLD_NOW);
	if (handle == NULL) {
		printf("Error opening: %s\n", dlerror());
		goto exit;
	}

	void *symbol = dlsym(handle, "print_hello");
	if (symbol == NULL) {
		printf("Error loading symbol: %s\n", dlerror());
		goto close_exit;
	}

	void (*print_hello_dyn)(void) = symbol;
	print_hello_dyn();

close_exit:
	dlclose(handle);
exit:
	return 0;
}
$ gcc main_dyn.c -ldl -o main_dyn
$ ./main_dyn
Hello!
1 Beğeni